PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

psycopg2 :Cursor bereits geschlossen

Wenn die Verbindung unterbrochen wurde, müssten Sie sie vermutlich wiederherstellen und einen anderen Cursor im Ausnahmehandler erhalten:

for query in queries:
    try:
        cursor.execute(query)
    except Exception as e:
        print e.message
        conn = psycopg2.connect(....)
        cursor = conn.cursor()

Sie sollten bei den Ausnahmen, die Sie abfangen, genauer sein. Angenommen ein InterfaceError Ausnahme, wenn der Cursor irgendwie geschlossen ist, können Sie das so abfangen:

except psycopg2.InterfaceError as e:

Es kann andere, weniger drastische Probleme geben, die die Ausführung nachfolgender Abfragen verhindern, z. die Transaktion wird abgebrochen. In diesem Fall müssen Sie die aktuelle Transaktion rückgängig machen und dann die nächste Abfrage versuchen:

queries = ['select count(*) from non_existent_table', 'select count(*) from existing_table']
for query in queries:
    try:
        cursor.execute(query)
    except psycopg2.ProgrammingError as exc:
        print exc.message
        conn.rollback()
    except psycopg2.InterfaceError as exc:
        print exc.message
        conn = psycopg2.connect(....)
        cursor = conn.cursor()

Hier wird eine Abfrage auf eine nicht vorhandene Tabelle versucht. Ein ProgrammingError Eine Ausnahme wird ausgelöst, und die Verbindung muss zurückgesetzt werden, wenn eine weitere Abfrage versucht werden soll. Die zweite Abfrage sollte erfolgreich sein.

Dies verschweigt die Details weiterer Ausnahmen, die in den Ausnahmebehandlern selbst ausgelöst werden, z. B. connect(...) kann fehlschlagen, wenn Sie versuchen, die Verbindung wiederherzustellen, also sollten Sie das auch handhaben.