このようにデータベースに対してスクリプトを実行します...
psql -d myDataBase -a -f myInsertFile.sql
唯一の問題は、スクリプトを実行するスキーマをこのコマンドで指定できるようにしたいことです。set search_path='my_schema_01' を呼び出すこともできますが、ファイルは移植可能であるはずです。これどうやってするの?
このようにデータベースに対してスクリプトを実行します...
psql -d myDataBase -a -f myInsertFile.sql
唯一の問題は、スクリプトを実行するスキーマをこのコマンドで指定できるようにしたいことです。set search_path='my_schema_01' を呼び出すこともできますが、ファイルは移植可能であるはずです。これどうやってするの?
set schema ...
ステートメントを含む1つのファイルを作成してから、実行する実際のファイルを含めることができます。
ファイルを作成しますrun_insert.sql
:
set schema 'my_schema_01';
\i myInsertFile.sql
次に、次を使用してこれを呼び出します。
psql -d myDataBase -a -f run_insert.sql
より普遍的な方法は、search_path を設定することです (PostgreSQL 7.x 以降で動作するはずです):
SET search_path TO myschema;
set schema myschema
は上記のコマンドのエイリアスであり、8.xでは使用できないことに注意してください。
参照: http://www.postgresql.org/docs/9.3/static/ddl-schemas.html
主な例
以下の例では、スキーマ myschema を使用してデータベースmydatabaseでmyfile.sqlを実行します。
psql "dbname=mydatabase options=--search_path=myschema" -a -f myfile.sql
これが機能する方法は、 psqlコマンドの最初の引数がdbname引数であることです。ドキュメントには、接続文字列を提供できることが記載されています。
このパラメーターに = 記号が含まれているか、有効な URI プレフィックス (postgresql:// または postgres://) で始まる場合、conninfo 文字列として扱われます。
dbname キーワードは接続先のデータベースを指定し、options キーワードは接続の開始時にサーバーに送信するコマンドライン オプションを指定します。これらのオプションについては、サーバー構成の章で詳しく説明しています。スキーマを選択するために使用しているオプションはsearch_pathです。
もう一つの例
以下の例では、スキーマ myschema を使用して、データベースmydatabaseのホストmyhostに接続します。特殊文字は、エスケープ シーケンスで URL エスケープする必要があります。=
%3D
psql postgres://myuser@myhost?options=--search_path%3Dmyschema
中間スキーマでデータインポートを実行しようとして、同様の問題に直面していました(後で最終スキーマに進みます)。拡張機能 (PostGIS など) に依存しているため、"run_insert" sql ファイルは問題を完全には解決しませんでした。
しばらくして、少なくとも Postgres 9.3 では解決策がはるかに簡単であることがわかりました...テーブルを参照するときに常にスキーマを指定するSQL スクリプトを作成するだけです:
CREATE TABLE "my_schema"."my_table" (...);
COPY "my_schema"."my_table" (...) FROM stdin;
このように使用psql -f xxxxx
すると完全に機能し、search_paths を変更したり、中間ファイルを使用したりする必要はありません (拡張スキーマの問題は発生しません)。