2016-07-06 74 views

risposta

2

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 
+0

Questo sembra molto pulito. Sarebbe bello se 'psycopg' supportasse questi cursori fuori dagli schemi. – planetp

Problemi correlati