postgresql 使用psycopg 2,如何从psycopg 2查询执行中真实的接收“Raise Info”foo“的输出

chhqkbe1  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(142)

我有一个长时间运行的存储过程,它使用Raise Info 'some status'来通知客户端。下面是一个虚拟函数来说明这一点:

Create or Replace Function Test_Raise() Returns void language plpgsql as $$
    DECLARE
        _X Text;
    Begin
        Raise Info 'Test 1 %', clock_timestamp();
        _x = pg_sleep(2);
        Raise Info 'Test 2 %', clock_timestamp();
        _x = pg_sleep(10);
        Raise Info 'Test 3 %', clock_timestamp();
    End;$$;

psqlDataGrip之类的客户端中调用select Test_Raise();,会显示执行每个Raise语句时的输出。使用psycopg2(v2.9.9),所有这些都显示在最后。
我已经为conn.noticesconn.notifier设置了对象,这些对象在附加内容后立即显示输出添加,只有notices属性才会产生结果,并且只有在查询完成时才会产生结果(它们都附加到最后的列表中)。
如有任何关于如何从raise语句中获取实时信息的建议,我们将不胜感激。
对于那些不太了解psycopg2的人来说,这里是复制的简单代码:

import psycopg2

class Log(list):
    def append(self,item):
        print(item)
        super().append(item)

conn = psycopg2.connect(dbname='jade_replica', host='10.158.1.63', port=32222, user='postgres', password='moozle')
conn.notifies = Log()
conn.notices = Log()
cur = conn.cursor()
cur.execute("select * from test_raise()")
ttcibm8c

ttcibm8c1#

这是psycopg2的一个限制;最好的解决方案是使用psycopg(实际上是版本3)。它或多或少与psycopg2兼容,但通过add_notice_handler方法更好地处理来自服务器的异步通信。

相关问题