この回答が気に入らないのではないかと心配していますが、現時点では不可能です。psqlドキュメントから:
将来のクエリ結果をファイルfilenameに保存するか、将来の結果を別のUnixシェルにパイプしてコマンドを実行します。引数が指定されていない場合、クエリ出力は標準出力にリセットされます。
「クエリ結果」には、データベースサーバーから取得したすべてのテーブル、コマンド応答、通知、およびデータベースをクエリするさまざまなバックスラッシュコマンド(\ dなど)の出力が含まれますが、エラーメッセージは含まれません。
お気づきのように、psql
インタラクティブに使用する場合、エラーメッセージをリダイレクトする方法はありません。
(\ oから無用へのあらゆる種類のリダイレクトで遊んでいます。クエリ出力チャネルはエラーメッセージを取得するチャネルとは異なるようです。また、サーバーからのエラーやプロシージャで発生したエラーも異なる方法で処理されます。 。
test=# SHOW client_min_messages;
client_min_messages
---------------------
notice
-- added the above to show it's not a config problem
CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
RAISE NOTICE 'notice';
RETURN 1;
END;
$body$
LANGUAGE plpgsql;
test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE: notice
test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE: notice
out.sqlに含まれるもの
raise_test
------------
1
(1 row)
両方の場合において。これが、プロシージャから生成されたメッセージを出力するためにどのチャネル/ファイル記述子が使用されるかについて私が無知である理由です。)
(PostgreSQLハッカーには、この問題を明らかにするスレッドがあります:http : //postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html)
どのような1はおそらく開始されない可能性がpsql
似
psql test >/tmp/psql.out 2>&1
これにより、すべての出力が指定されたファイルにリダイレクトされます。これに関する唯一の問題は、プロンプトさえも持たず、コマンドライン編集機能を失うことです。