46

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. コマンドラインで既存のテンプレートに基づいてデータベースを作成する方法
4

5 に答える 5

59

まず、メタコマンドとコマンドを混在させないでください。これらは個別のコマンドセットです。それらを組み合わせるためのトリックがあります(psqlメタコマンドとシェル内のpsqlへの文字列のパイプを使用)が、すぐに混乱します。psqlSQL\o\\

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

OSユーザーとして操作しpostgres、DBロールを(デフォルトの)Postgresスーパーユーザーとして使用すると仮定するとpostgres、すべてのデータベースはデフォルトポート5432の同じDBクラスターにあり、デフォルト設定の設定postgresにより、ロールにはパスワードなしのアクセス権があります。IDENTpg_hba.conf

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

新しいテンプレートデータベースは、デフォルトのシステムテンプレートデータベースに基づいていますtemplate0マニュアルの基本はこちら。

あなたの質問

(...)ファイルから一連のpgsqlコマンドを実行する方法

試す:

psql mytemplate1 -f file

ディレクトリ内のファイルのバッチのスクリプトファイルの例:

#! /bin/sh

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

コマンドオプション-fpsql使用すると、ファイル内でSQLコマンドを実行できます。

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

psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'

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

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

于 2011-12-21T20:00:39.067 に答える
3

コマンドをpsql入力に送信できechoます。

for dbname in foo foofoo foobar barbar
do
    echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
于 2011-12-21T18:59:08.097 に答える
1

あなたがさらに一歩進んでも構わないと思っているなら、あなたはおそらくsqlalchemyでより多くの成功を収めるでしょう。これにより、bashの代わりにpythonを使用してスクリプトを作成できるようになります。これにより、より簡単で制御が向上します。

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

于 2011-12-21T19:09:59.697 に答える
1

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

または、ここからツール全体をgitcloneします

于 2017-03-30T19:30:47.643 に答える
1

あなたがそれをしなければならないそのユースケースのために....

これは、JSONをPostgreSQL(WSL Ubuntu)にインポートするために使用したスクリプトです。基本的に、同じコマンドラインでpsqlメタコマンドとSQLを混在させる必要があります。疑似ttyを割り当てるややあいまいなスクリプトコマンドの使用に注意してください。

$ more update.sh
#!/bin/bash
wget <filename>.json
echo '\set content `cat $(ls -t <redacted>.json.* | head -1)` \\ delete from <rable>; insert into <table> values(:'"'content'); refresh materialized view <view>; " | PGPASSWORD=<passwd> psql -h <host> -U <user> -d <database>
$ 
于 2020-06-23T19:03:53.783 に答える