2014-12-01 57 views
7

我想通過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輸出中顯示警告信息?

回答

7

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