通过psycopg2获取警告消息

问题描述:

我想通过psycopg2调用plpgsql函数并查看警告消息。 即,我有这样的功能:通过psycopg2获取警告消息

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

,并在Python调用它这样:

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

不幸的是在PLPGSQL定义的警告消息,任何地方都不会在Python输出显示。 有没有办法让python输出中显示警告信息?

connectionnotices件发送到客户端到这一点会话的消息的列表:

for notice in conn.notices: 
    print notice 

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

得到最后通知:

print conn.notices[-1] 

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

+1

非常感谢,这个作品。但是如果我为许多游标使用相同的连接呢?我尝试重置通知:'conn.notices = {}'但我得到了TypeError:readonly属性的异常。 我可以在执行该功能时得到警告吗?比方说,该函数会引发一个警告,然后是一个异常:我希望在引发异常之前看到警告。 – 2014-12-02 07:51:21

+0

@Tomm更新中...... – 2014-12-02 11:33:51

+2

@Tomm您可以使用'del conn.notices [:]'清除通知。在同步模式下执行时,您无法获得通知。也许在异步模式是的,但我从来没有尝试过。 – piro 2014-12-05 12:34:15