2014-12-01 19 views
7

Chcę wywołać funkcję plpgsql przez psycopg2 i zobaczyć komunikaty ostrzegawcze. tzn, mam tę funkcję:Otrzymuj wiadomości ostrzegawcze za pośrednictwem psycopg2

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

i nazywają to tak w python:

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

Niestety komunikat ostrzegawczy określony w plpgsql nigdzie nie pojawia się na wyjściu Pythona. Czy istnieje sposób, aby komunikat ostrzegawczy został wydrukowany na wyjściu Pythona?

Odpowiedz

7

Członek Rady connectionnotices znajduje się lista komunikatów sesji jest wysyłany do klienta aż do tego punktu:

for notice in conn.notices: 
    print notice 

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

Aby uzyskać ostatniego zawiadomienia:

print conn.notices[-1] 

Jeśli wyjątek zostanie zgłoszony wewnątrz funkcji i nie zostanie przechwycony, żadne ostrzeżenie nie zostanie odebrane. Dzieje się tak dlatego, że funkcja zawija transakcję niejawną, a wszystko wewnątrz tej transakcji jest wycofywane, w tym ostrzeżenia.

+1

Dziękuję bardzo, to działa. Ale co jeśli używam tego samego połączenia dla wielu kursorów? Próbowałem resetowania powiadomień, tak: 'conn.notices = {}', ale mam wyjątek TypeError: readonly atrybut. Czy mogę uzyskać ostrzeżenie, gdy funkcja jest wykonywana? Powiedzmy, funkcja wywołuje ostrzeżenie, a następnie wyjątek: chciałbym zobaczyć ostrzeżenie przed zgłoszeniem wyjątku. –

+0

@Najczęściej aktualizowany ... –

+2

@To możesz usunąć powiadomienia za pomocą 'del conn.notices [:]'. Nie możesz mieć powiadomień podczas wykonywania w trybie synchronizacji. Może w trybie asynchronicznym tak, ale nigdy tego nie próbowałem. – piro

Powiązane problemy