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
これを行う方法に関する提案はありますか? (ご想像のとおり、私はシェルスクリプトの初心者です。)
質問をさらに明確にするために、私は知りたい:
まず、notpsql
メタコマンドとSQL
コマンドを混合します。これらは個別のコマンドセットです。これらを組み合わせるためのトリックがあります(psqlメタコマンド\o
および\\
を使用し、シェルで文字列をpsqlにパイピングします)。
システムユーザーpostgres
として動作しており、Postgresスーパーユーザーとしてpostgres
を持っていると仮定します。デフォルトポート5432上の同じdbクラスター内のすべてのデータベースとユーザーpostgres
は、pg_hba.conf
のIDENT
設定(デフォルト設定)によりパスワードなしでアクセスできます。
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コマンドオプション についてお読みください。
接続するデータベースを提供しない場合、psql
はpostgres
という名前のデフォルトのメンテナンスデータベースを使用します。 2番目の回答では、どのデータベースに接続するかは関係ありません。
psql入力に対してコマンドをecho
できます:
for dbname in foo foofoo foobar barbar
do
echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
さらに進んでいくなら、おそらく sqlalchemy でもっと成功するでしょう。これにより、bashの代わりにpythonを使用してスクリプトを構築できます。
コメントで要求されたとおり: https://github.com/srathbun/sqlCmd