2014-12-01 17 views
7

Tôi muốn gọi hàm plpgsql thông qua psycopg2 và xem các thông báo cảnh báo. tức là, tôi có chức năng này:Nhận tin nhắn cảnh báo qua psycopg2

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

và gọi nó như vậy trong python:

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

Thật không may là thông điệp cảnh báo theo quy định tại plpgsql không xuất hiện bất cứ nơi nào trong đầu ra python. Có cách nào để nhận thông điệp cảnh báo được in trong đầu ra python không?

Trả lời

7

Các notices thành viên của connection là một danh sách các thông điệp của phiên gửi cho khách hàng đến thời điểm đó:

for notice in conn.notices: 
    print notice 

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

Để có được thông báo lần cuối:

print conn.notices[-1] 

Nếu ngoại lệ được nâng lên bên trong một hàm, và không bị bắt, sẽ không nhận được cảnh báo nào. Đó là bởi vì một hàm kết thúc một giao dịch tiềm ẩn và mọi thứ bên trong giao dịch đó được khôi phục bao gồm các cảnh báo.

+1

Cảm ơn bạn rất nhiều, tính năng này hoạt động. Nhưng nếu tôi sử dụng cùng một kết nối cho nhiều con trỏ thì sao? Tôi đã thử đặt lại thông báo như vậy: 'conn.notices = {}' nhưng tôi có ngoại lệ TypeError: thuộc tính chỉ đọc. Và tôi có thể nhận được cảnh báo trong khi chức năng được thực thi không? Nói, hàm tăng cảnh báo và sau đó là ngoại lệ: Tôi muốn xem cảnh báo trước khi ngoại lệ được nâng lên. –

+0

@Tomm Updated ... –

+2

@Tomm bạn có thể xóa thông báo bằng 'del conn.notices [:]'. Bạn không thể có các thông báo trong khi thực hiện trong chế độ đồng bộ. Có lẽ trong chế độ async có nhưng tôi chưa bao giờ thử nó. – piro

Các vấn đề liên quan