web-dev-qa-db-ja.com

Postgres COPY TOを使用してファイルを上書きせずにデータをエクスポートする

スクリプトとpsqlでいくつかのクエリを実行しています。また、COPY TOコマンドを使用して結果をa.csvにエクスポートしています。ただし、代わりに結果をa.csvに追加したい場合、これはファイルa.csvを上書きします。

COPY TO構文を使用することは可能ですか?それとも他のツールの使用を検討すべきですか?

3
Zeruno

メタコマンド \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が使用されている場合、ファイルのアクセス可能性とアクセス権はサーバーではなくクライアントに依存します。

OrAbelistoのコメント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がファイルに追加されます。

7

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;
1
Evan Carroll