通过psycopg2获取警告消息

Tom*_*ico 11 python postgresql psycopg2

我想通过psycopg2调用plpgsql函数并查看警告消息.即,我有这个功能:

create or replace function test_warning() returns void as $$
begin
raise warning 'this is only a test';
end; 
$$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)

并在python中调用它:

import psycopg2
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
cursor.callproc("test_warning")
# or so:
cursor.execute('SELECT test_warning()')
Run Code Online (Sandbox Code Playgroud)

不幸的是,plpgsql中定义的警告消息不会出现在python输出中的任何位置.有没有办法在python输出中打印警告消息?

Clo*_*eto 10

notices成员connection是发送到客户端的会话消息列表,直到该点:

for notice in conn.notices:
    print notice
Run Code Online (Sandbox Code Playgroud)

http://initd.org/psycopg/docs/connection.html#connection.notices

要获得最后通知:

print conn.notices[-1]
Run Code Online (Sandbox Code Playgroud)

如果在函数内引发异常但未捕获,则不会收到警告.这是因为函数包装了一个隐式事务,并且该事务中的所有内容都被回滚,包括警告.

  • 非常感谢,这有效。但是如果我对多个游标使用相同的连接怎么办?我尝试重置通知: `conn.notices={}` 但我得到了异常 TypeError: readonly attribute。我可以在函数执行时收到警告吗?假设该函数引发警告,然后引发异常:我希望在引发异常之前看到警告。 (2认同)
  • @Tomm你可以用`del conn.notices [:]`来清除注意事项.在同步模式下执行时,您无法获得通知.也许在异步模式下是,但我从未尝试过. (2认同)

Joh*_*röm 6

我没有对 Clodoaldo 的答案发表评论的声誉,但我获取最新通知的解决方案(请注意,查询可以生成多个通知)非常简单:

def execute_query(query, conn):
    logger = logging.getLogger('test')
    nr_notices = len(conn.notices)
    cursor = conn.cursor()
    cursor.execute(query)
    for notice in conn.notices[nr_notices:]:
        logger.info(f'NOTICE: {notice}.')
Run Code Online (Sandbox Code Playgroud)