74

このようにデータベースに対してスクリプトを実行します...

psql -d myDataBase -a -f myInsertFile.sql

唯一の問題は、スクリプトを実行するスキーマをこのコマンドで指定できるようにしたいことです。set search_path='my_schema_01' を呼び出すこともできますが、ファイルは移植可能であるはずです。これどうやってするの?

4

8 に答える 8

82

set schema ...ステートメントを含む1つのファイルを作成してから、実行する実際のファイルを含めることができます。

ファイルを作成しますrun_insert.sql

set schema 'my_schema_01';
\i myInsertFile.sql

次に、次を使用してこれを呼び出します。

psql -d myDataBase -a -f run_insert.sql
于 2012-12-07T21:06:30.937 に答える
68

より普遍的な方法は、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

于 2014-07-29T11:25:00.190 に答える
47

主な例

以下の例では、スキーマ 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
于 2016-02-11T18:32:12.893 に答える
-2

中間スキーマでデータインポートを実行しようとして、同様の問題に直面していました(後で最終スキーマに進みます)。拡張機能 (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 を変更したり、中間ファイルを使用したりする必要はありません (拡張スキーマの問題は発生しません)。

于 2014-11-05T11:13:23.893 に答える