PostgreSQL psql でスプール出力


結論

-L オプションを使えば良い(PostgreSQL 8.1 から追加)。

psql ... -L psql.log

-L filename --log-file=filename すべての問い合わせの出力を通常の出力先に出力し、さらにファイル filename に書き出します。

以下のようなログが出力される。

/******** QUERY *********/
select count(*) from foo;
/************************/

 count 
-------
   218
(1 row)

/******** QUERY *********/
select id, name from foo limit 5;
/************************/

 id  | name  
-----+----------
 869 | ABB
 881 | AAB
 875 | ABC
 891 | AAA
 895 | AAB
(5 rows)

\i メタコマンドでファイルから読み込んだSQLとその結果もファイル出力される。

ただし、エラーになったSQLは出力されるが、そのエラー内容などはファイル出力されない。


その他の方法

似たようなオプションに以下がある。

-o filename --output=filename 全ての問い合わせの出力をfilenameファイルに書き込みます。 これは\oコマンドと同じ効力を持ちます。

これは、クエリ結果のみをファイル出力し、発行したSQLはログ出力されない。

\qecho でログに任意文字列を出力できるので、以下のようにすればSQLをログ出力することはできる、が あまりに面倒。

# \qecho select count(*) from foo;
# select count(*) from foo;


Linux なら script で記録してしまうのが簡単。

$ script psql.log
$ psql -h host -p port -d db -U user -a
...

# \q
$ <Ctrl + D>

script の終了は Ctrl + D


PowerShell なら Start-Transcript Stop-Transcript になるのだが

> Start-Transcript -Path "./psql.log"
> psql -h host -p port -d db -U user -a
...

# \q
> Stop-Transcript

しかし、Start-Transcript では psqlコマンド出力の最後のバッファ分しかログ出力されない。 ので、Start-Transcript Stop-Transcript は使えない。