Sono molto lontano dall'essere psycopg2
o Postgres
esperto, e, sono sicuro che ci sia una soluzione migliore per aumentare il livello di avviso, ma qui è qualcosa che ha funzionato per me - a custom cursor che guarda in connection notices e, se c'è qualcosa lì - lancia un'eccezione. L'implementazione è di per sé a fini di istruzione per lo più - sono sicuro che deve essere regolato per funzionare nel vostro caso d'uso:
import psycopg2
# this "cursor" class needs to be used as a base for custom cursor classes
from psycopg2.extensions import cursor
class ErrorThrowingCursor(cursor):
def __init__(self, conn, *args, **kwargs):
self.conn = conn
super(ErrorThrowingCursor, self).__init__(*args, **kwargs)
def execute(self, query, vars=None):
result = super(ErrorThrowingCursor, self).execute(query, vars)
for notice in self.conn.notices:
level, message = notice.split(": ")
if level == "WARNING":
raise psycopg2.Warning(message.strip())
return result
campione Uso:
conn = psycopg2.connect(user="user", password="secret")
cursor = conn.cursor(conn, cursor_factory=ErrorThrowingCursor)
Questo sarebbe un'eccezione (di un psycopg2.Warning
digita) se è stato emesso un avviso dopo l'esecuzione di una query. Campione:
psycopg2.Warning: there is already a transaction in progress
Questo sembra molto pulito. Sarebbe bello se 'psycopg' supportasse questi cursori fuori dagli schemi. – planetp