web-dev-qa-db-ja.com

PostgreSQLクエリ出力をcsvファイルにエクスポートする方法

PostgreSQLの出力をシェルからcsvファイルにエクスポートする際に問題があります。
私のSQLスクリプトはscript.sqlと呼ばれます。

シェルで次のコマンドを入力しました。

psql congress -af script.sql &> filename.csv

しかし、filename.csvファイルを開くと、すべての列の値がExcel csvの1つの列に絞り込まれます(添付のスクリーンショットを参照)。

それから私は別の方法を試しました。 script.sqlを次のように編集しました:

Copy (Select * From ...) To '/tmp/filename.csv' With CSV;

次に、データベースdbname内のシェルで次のコマンドを入力しました。

\i script.sql

出力は次のとおりです。

COPY 162

さて、出力クエリには162行あります。

したがって、出力テーブルの162行がシェルにコピーされました。それらをcsvファイルに貼り付けるまたは移動するにはどうすればよいですか?

または、filename.csv(スクリーンショットが添付されています)を使用する場合、csv/Excelファイルの形式を修正するにはどうすればよいですか?

Screenshot of filename.csv

19
mflowww

最新の構文:

COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);

したがって、出力テーブルの162行がシェルにコピーされました。それらをcsvファイルに貼り付けるまたは移動するにはどうすればよいですか?

結果CSVファイルです。一致する区切り文字を使用して、スプレッドシートプログラムで開きます。 ドキュメントごと:

デフォルトは、テキスト形式のタブ文字、CSV形式のカンマです。

Patrick commented と同様に、対応するpsqlメタコマンド\copy同様の方法で。クライアントにローカルなファイルを書き込み(および読み取り)、スーパーユーザー特権を必要としません。

これらの関連する回答の詳細:

33

少し接線を外して、別の方法もあります。

Windowsバッチスクリプトで次を使用します。-

psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name   FROM information_schema.tables WHERE table_schema = '%qSchema%';"

秘Theは-Aオプションを覚えておくことです。データの空白埋め込みを抑制します。

これは、postgressを実行しているアカウントがスケジュールされたバッチファイルを実行しているアカウントと同じ権限を持っていない場合に、上記のCOPYコマンドからの権限エラーを回避するためです。

これにより、特定のスキーマ内のテーブルのリストが取得され、次のような結果が得られます。

myschema | mytable1

myschema | mytable2

次に、FORバッチコマンドを使用して各行を処理します。本当にCSVファイルが必要な場合、あなたがする必要があるのはこれだけでしょう:-

ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv

おそらく最も効率的なメカニズムではありませんが、少数の出力行で正常に機能します。

1
Darren Gill

最初に接続情報を〜/ .pgpassにコピーし、

cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz
0
Ash