1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

psqlコマンド SQLファイルの実行結果をCSVに出力方法

Posted at

psqlコマンドでSQL抽出結果をCSVファイルに出力する方法のまとめです。
色々制限があって、詰まったところが多々あったので、
備忘録ついでに投稿します。

実施環境

OS: Windows 11
DBMS: PostgreSQL16
エミュレータ: TeraTerm 5.2

実現したいこと

SQL実行結果をCSVファイルに出力する

条件

➀実行するクエリはSQLファイルに保存したものを呼び出す
②実行はデータベースに接続後、実施する
③セル内改行やセル内カンマに対応 ※ダブルクォーテーションで囲む

問題点(試したこと)

\copyコマンドで実行(条件➀が達成できない)

CSV出力といえば、\copyコマンドがまず検索で該当します。
例えば、

\copy (SELECT * FROM table) to 'export.csv' DELIMITER ',' WITH CSV FORCE QUOTE *

これでクエリ結果をCSVに出力できて、
CSV形式の区切り文字[,]
ダブルクォーテーションで囲まれます。
ただし、残念ながら保存したSQLファイルでクエリを実行できない。

COPY文で実行(実行できない)

じゃあということでSQL文にCOPY文を記載しておいて、
実行してみます。
SQL文はこんな感じ

COPY (SELECT * FROM table) TO 'export.csv' DELIMITER ',' WITH CSV FORCE QUOTE *;

こいつを\iコマンドで実行すればいける!
と思いきや、postgreがリモートだとCOPY文は実行できないらしいです。
ローカルでしか使えないとは.......

psqlコマンドで出力方法を変更する(条件③が達成できない)

ならばならばということで、
psqlコマンドで出力条件と出力先を設定して、
SQLファイルで実行してみました。

\a             - 文字揃えをオフ
\f ','         - 区切り文字をカンマに
\o export.csv  - 出力先を変更
\i export.sql  - SQLファイルを実行

確かにCSVにカンマ区切りで出力できる!
のですが、セル内改行があってもダブルクォーテーションで囲めない
おしい

実現方法

色々試してたどり着いたのが、
\psetコマンドで出力形式をCSVフォーマットに変更してから、
実行する方法です。

\pset format CSV  - CSV出力形式に変更
\o export.csv     - 出力先を変更
\i export.sql     - SQLファイルを実行

なんとこれだけで、カンマ区切りにもなって、
セル内改行やセル内カンマがあるとダブルクォーテーションで囲ってくれて、
\iコマンドも併用できる。やったー!
注意点としてはPostgreSQL 12以降じゃないとサポートされてないようです。

まとめ

今回は、psqlコマンドを使ってのクエリ結果のCSV出力方法でした。
色々と制限があること前提なので、
\copyコマンドで問題ない場合がほとんどな気はしますが、
色々こねくりまわした結果お手軽な方法にたどり着いたので、
これはこれで良し

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?