恐怕您不会喜欢这个答案,但是目前看来这是不可能的。从psql文档中:
将将来的查询结果保存到文件名中,或将将来的结果通过管道传递到单独的Unix Shell中以执行命令。如果未指定任何参数,则查询输出将重置为标准输出。
“查询结果”包括从数据库服务器获得的所有表,命令响应和通知,以及查询数据库的各种反斜杠命令的输出(例如\ 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)
一个人可能会做的psql
像
psql test >/tmp/psql.out 2>&1
并将所有输出重定向到指定文件。唯一的问题是您甚至没有提示,并且失去了命令行编辑功能。