Получать предупреждения через psycopg2
Я хочу вызвать функцию plpgsql через psycopg2 и увидеть предупреждающие сообщения.
I.e, я имею эту функцию:
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?
Ответы
Ответ 1
notices
connection
является список сообщений сеанса, отправленных клиенту до этого момента:
for notice in conn.notices:
print notice
http://initd.org/psycopg/docs/connection.html#connection.notices
Чтобы получить последнее уведомление:
print conn.notices[-1]
Если исключение возникает внутри функции и не попадает, предупреждение не будет получено. Это связано с тем, что функция обертывает неявную транзакцию и все внутри этой транзакции откатывается назад, включая предупреждения.
Ответ 2
У меня нет репутации, чтобы комментировать ответ 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}.')