スクリプトとpsqlでいくつかのクエリを実行しています。また、COPY TOコマンドを使用して結果をa.csvにエクスポートしています。ただし、代わりに結果をa.csvに追加したい場合、これはファイルa.csvを上書きします。
COPY TO構文を使用することは可能ですか?それとも他のツールの使用を検討すべきですか?
メタコマンド \copy
in psql を使用できます(SQL COPY
をカプセル化します)コマンドライン、それをstdout
に送信し、出力をappendedにファイルにリダイレクトします->>
の代わりに>
を使用:
psql -c '\copy (SELECT 1, 2) to stdout' >> /path/to/file_to_append_to.csv
(おそらく、さらに多くの接続パラメーターが必要です。)
SQL COPY
も使用できます。
psql -c 'COPY (SELECT 1, 2) TO STDOUT' >> /path/to/file_to_append_to.csv
ただし、代わりに\copy
を使用する方が便利です( マニュアルの引用 )。
\copy
が使用されている場合、ファイルのアクセス可能性とアクセス権はサーバーではなくクライアントに依存します。
Or、 Abelistoのコメント 、inside psqlまたはその他のクライアントから-プログラムcat
が利用可能(基本的にすべての* nix OSで):
COPY (SELECT 1, 2) TO PROGRAM 'cat >> /path/to/file_to_append_to.csv'
Or、まだinside psqlからanyシステムで、現在のディレクトリと出力ファイルを次のように設定できます。
\cd /path/to/
\o file_to_append_to.csv
ファイルがまだ存在しない場合は、ファイルのみが作成されます。
その後、SQL COPY
(または\copy
も同様に)することもできます。
COPY (SELECT 1, 2) TO STDOUT;
出力はappendがファイルに追加されます。
UNION
およびCOPY
を使用して複数のクエリを同じファイルにエクスポートするCOPY TO
とクエリ。
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
TO { 'filename' | PROGRAM 'command' | STDOUT }
[ [ WITH ] ( option [, ...] ) ]
だからこのようなもの
COPY (
SELECT * FROM generate_series(1,10) AS t(x)
UNION ALL
SELECT * FROM generate_series(10,20) AS t(x)
) TO '/tmp/foo.csv' CSV;