\copy
一時テーブルを使用できます。
最初に、コマンドラインでバージョン9.0を使用してこれをテストおよび確認しました。
次に、\copy
複数の一時テーブルを使用して、SQLおよびpsqlメタコマンドでファイルを作成しました。それもうまくいきました。
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
コール:
psql -p5432 mydb -f test.sql
ファイルの終わりで暗黙的に終了する終了セミコロンに注意してください。ただし、他のSQLステートメントの後に、またpsqlでインタラクティブに実行する場合は最後のステートメントの後にも必要です。
通常、psqlメタコマンドは、ごとに実行されるファイルの同じ行でSQLと混在させることはできませんpsql -f
。私はpsqlのマニュアルを引用します:
引数の解析は、行の終わり、または引用符で囲まれていない別のバックスラッシュが見つかったときに停止します。引用符で囲まれていないバックスラッシュは、新しいメタコマンドの始まりと見なされます。特別なシーケンス\\
(2つの円記号)は、引数の終わりを示し、SQLコマンドがあれば、それを解析し続けます。これにより、SQLコマンドとpsqlコマンドを1行に自由に混在させることができます。しかし、いずれにせよ、メタコマンドの引数は行末を超えて続けることはできません。
ただし、の後に \copy
は異なるルールが適用されます。基本的に、psqlは以下のように自動的にSQLモードに戻ります\copy
。
しかし、すべてのコマンドが別々の行にあると書いています。したがって、それはあなたの場合の説明にはなりません。
さておき、あなたが使用して検討していることのすべてCOPY
(SQLコマンド)の代わりに、\copy
(psqlのメタコマンドを)?
もちろん、この場合、ターゲットファイルはクライアントではなくサーバーにローカルである必要があります。また、さまざまなファイル権限が適用されます。マニュアル:
COPY
コマンドで指定されたファイルは、クライアントアプリケーションではなくサーバーによって直接読み書きされます。したがって、クライアントではなく、データベースサーバーマシンに常駐するか、データベースサーバーマシンからアクセスできる必要があります。それらは、クライアントではなく、PostgreSQLユーザー(サーバーが実行されているユーザーID)からアクセス可能であり、読み取りまたは書き込み可能でなければなりません。