2017-02-22 111 views
10

これはthis answerから "Save PL/pgSQL output from PostgreSQL to a CSV file"のフォローアップの質問です。複数行のクエリにはpsqlの copyを使用してください

psqlの\copy commandを使用してクライアント側のCSVファイルを作成する必要があります。 1つのライナーは動作します:

db=> \copy (select 1 AS foo) to 'bar.csv' csv header 
COPY 1 

しかし、私はいくつかの行にまたがる長いクエリを持っています。私はパースエラーなしでこの過去の1行を伸ばすように見えることはできませんように私は、クエリを表示する必要はありません。

db=> \copy (
\copy: parse error at end of line 
db=> \copy (\\ 
\copy: parse error at end of line 
db=> \copy (" 
\copy: parse error at end of line 
db=> \copy "(
\copy: parse error at end of line 
db=> \copy \\ 
\copy: parse error at end of line 

は複数行にまたがるクエリで\copyを使用することが可能ですか?私はWindowsでpsqlを使用しています。

+0

おそらく改行をエスケープする必要がありますか? – Falmarri

+0

@Falmarri私の質問にはいくつかの一般的なエスケープ試行を入れましたが、 "psqlの...バックスラッシュのエスケープは" \ copy'には適用されません。 –

+0

私は彼女に答えを投稿しました:http://stackoverflow.com/a/44043716/24105これは、複数の行を取得するためのラウンドアバウト方法です。 –

答えて

11

私が今実施している解決策は、create a temporary viewです。このコマンドは、複数の行にまたがって宣言することができ、\copyコマンドで選択することができます。これは1行に快適にフィットします。

db=> CREATE TEMP VIEW v1 AS 
db-> SELECT i 
db-> FROM generate_series(1, 2) AS i; 
CREATE VIEW 
db=> \cd /path/to/a/really/deep/directory/structure/on/client 
db=> \copy (SELECT * FROM v1) TO 'out.csv' csv header 
COPY 2 
db=> DROP VIEW v1; 
DROP VIEW 
+0

一時ビューの場合は、ビューを明示的に削除する必要がありますか? – nyxz

+1

@nyxzこのビューを削除する必要はありません。 'v1'で処理するクエリが複数ある場合にのみ必要です。 –

関連する問題