sql >> Databáze >  >> RDS >> PostgreSQL

psycopg2 :kurzor je již uzavřen

Pravděpodobně pokud se připojení přeruší, budete jej muset znovu navázat a získat další kurzor v obslužné rutině výjimky:

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

Měl bys být konkrétnější až na výjimky, které chytáš. Za předpokladu InterfaceError výjimka, pokud je kurzor nějak zavřený, můžete to zachytit takto:

except psycopg2.InterfaceError as e:

Mohou se vyskytnout další méně drastické problémy, které zabrání provedení následných dotazů, např. transakce je přerušena. V takovém případě musíte aktuální transakci vrátit zpět a poté zkusit další dotaz:

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()

Zde je dotaz zkoušen na neexistující tabulku. ProgrammingError je vyvolána výjimka a připojení musí být odvoláno, pokud má být proveden další dotaz. Druhý dotaz by měl být úspěšný.

Toto zamlčuje podrobnosti o dalších výjimkách vyvolaných samotnými obslužnými rutinami výjimek, např.connect(...) může selhat při pokusu o opětovné navázání připojení, takže byste to měli řešit také.



  1. Uzamčení databáze MySQL tak, aby dotaz mohla spustit pouze jedna osoba?

  2. Mohu požádat Postgresql, aby ignoroval chyby v transakci

  3. Alternativa k bitovému provozu

  4. Aktualizujte hodnotu primárního klíče pomocí entity framework