web-dev-qa-db-ja.com

ファイルでpgsqlコマンドを実行するシェルスクリプト

TEMPLATEデータベースを作成する一連の手順を自動化しようとしています。

一連のファイル(file1、file2、... fileN)があり、各ファイルにはTEMPLATEデータベースの作成に必要なpgsqlコマンドのセットが含まれています。

ファイル(createdbtemplate1.sql)の内容は、おおよそ次のようになります。

CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8';

\c mytemplate1

CREATE TABLE first_table ( 
 --- fields here ..
);

-- Add C language extension + functions
\i db_funcs.sql

ファイル内のコマンドを実行するシェルスクリプトを作成できるようにしたいので、次のようなスクリプトを作成できます。

# run commands to create TEMPLATE db mytemplate1
# ./groksqlcommands.sh createdbtemplate1.sql

for dbname in foo foofoo foobar barbar
do
    # Need to simply create a database based on an existing template in this script
    psql CREATE DATABASE $dbname TEMPLATE mytemplate1
done

これを行う方法に関する提案はありますか? (ご想像のとおり、私はシェルスクリプトの初心者です。)

編集

質問をさらに明確にするために、私は知りたい:

  1. Groksqlcommands.sh(ファイルからpgsqlコマンドのセットを実行するbashスクリプト)の書き方
  2. コマンドラインで既存のテンプレートに基づいてデータベースを作成する方法
28

まず、notpsqlメタコマンドとSQLコマンドを混合します。これらは個別のコマンドセットです。これらを組み合わせるためのトリックがあります(psqlメタコマンド\oおよび\\を使用し、シェルで文字列をpsqlにパイピングします)。

  • ファイルにSQLコマンドのみが含まれるようにします。
  • SQLファイルにCREATE DATABASEステートメントを含めないでください。 dbを個別に作成します。同じテンプレートdbで実行するmultipleファイルがあります。

システムユーザーpostgresとして動作しており、Postgresスーパーユーザーとしてpostgresを持っていると仮定します。デフォルトポート5432上の同じdbクラスター内のすべてのデータベースとユーザーpostgresは、pg_hba.confIDENT設定(デフォルト設定)によりパスワードなしでアクセスできます。

psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
                  TEMPLATE template0"

システムテンプレートdb template0に基づいて新しいテンプレートdbを作成します。 それについての詳細はこちら を読んでください。
あなたの質問:

ファイルからpgsqlコマンドセットを実行する方法(...)

試してください:

psql mytemplate1 -f file

バッチの例:

#! /bin/sh

for file in /path/to/files/*; do
    psql mytemplate1 -f "$file"
done

コマンドオプション-fは、psqlにファイル内のSQLコマンドを実行させます。

コマンドラインで既存のテンプレートに基づいてデータベースを作成する方法

psql -c 'CREATE DATABASE myDB TEMPLATE mytemplate1'

コマンドオプション-cは、psqlに単一のSQLコマンド文字列を実行させます。 ;で終了する複数のコマンドにすることができます-oneトランザクションで実行され、最後のコマンドの結果のみが返されます。
マニュアルのpsqlコマンドオプション についてお読みください。

接続するデータベースを提供しない場合、psqlpostgresという名前のデフォルトのメンテナンスデータベースを使用します。 2番目の回答では、どのデータベースに接続するかは関係ありません。

45

psql入力に対してコマンドをechoできます:

for dbname in foo foofoo foobar barbar
do
    echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
3
Elias Dorneles

さらに進んでいくなら、おそらく sqlalchemy でもっと成功するでしょう。これにより、bashの代わりにpythonを使用してスクリプトを構築できます。

コメントで要求されたとおり: https://github.com/srathbun/sqlCmd

1
Spencer Rathbun

ルートディレクトリの下にSQLスクリプトを保存しますdev、tst、prdパラメーター化されたdbsを使用しますfindを使用して、示されているようにすべてのpgsqlスクリプトを実行します here エラー時に終了

または、ツール全体を here からgit cloneするだけです

0
Yordan Georgiev