如何获得输出流的通知?

Luc*_*c M 22 postgresql

我在函数中有调试消息。这些消息是这样提出的

RAISE NOTICE 'Value of id : %', id;

我设置了我的日志文件 \o messages.txt

然后我做我需要做的 \i process.sql

当执行终止时,\o.

问题是我没有将通知引发的消息放入messages.txt。消息显示在屏幕上,但我希望它们写在 messages.txt 中

我怎么能那样做?

我尝试使用RAISE LOG...并将消息写入日志文件...这不是我想要的。

我有一个工作

plsql -f /path/to/process.sql > messages.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

但我想知道如何在 plsql 客户端上使用 \i 和 \o 将消息放入 \o 中指定的文件中

我的 cygwin 客户端是 psql (PostgreSQL) 8.2.11,服务器版本是 9.0.7

dez*_*zso 8

恐怕你不会喜欢这个答案,但目前似乎不可能。从psql 文档

将未来的查询结果保存到文件 filename 或将未来的结果通过管道传输到单独的 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
Run Code Online (Sandbox Code Playgroud)

out.sql 包含

 raise_test
------------
          1
(1 row)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下。这就是为什么我对用于输出从过程中引发的消息的通道/文件描述符一无所知的原因。))

(有一个关于 PostgreSQL 黑客的线程可能会对此问题有所了解:http : //postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html

什么人可能做的是开始psql喜欢

psql test >/tmp/psql.out 2>&1
Run Code Online (Sandbox Code Playgroud)

这会将所有输出重定向到指定的文件。唯一的问题是您甚至没有提示,并且失去了命令行编辑功能。


Bra*_*n90 5

我们可以使用meta命令直接从psql执行shell命令\!

用户@db=# \! psql -U user -h localhost your_db -e '选择 your_function()' &> debug.txt

打开debug.txt\e

本地主机:5432 user@db=# \e debug.txt

引发消息将显示在您的默认编辑器中。有点棘手,但对于命令行爱好者来说仍然很方便。