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コマンドで問題ない場合がほとんどな気はしますが、
色々こねくりまわした結果お手軽な方法にたどり着いたので、
これはこれで良し