PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

psycopg2 :cursore già chiuso

Presumibilmente se la connessione è interrotta, dovresti ristabilirla e ottenere un altro cursore nel gestore delle eccezioni:

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

Dovresti essere più specifico con le eccezioni che catturi. Supponendo un InterfaceError eccezione se il cursore è in qualche modo chiuso puoi catturarlo in questo modo:

except psycopg2.InterfaceError as e:

Possono esserci altri problemi meno drastici che impediranno l'esecuzione di query successive, ad es. la transazione viene interrotta. In tal caso è necessario eseguire il rollback della transazione corrente e quindi provare la query successiva:

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

Qui viene provata una query su una tabella inesistente. Un ProgrammingError viene sollevata un'eccezione ed è necessario eseguire il rollback della connessione se deve essere tentata un'altra query. La seconda query dovrebbe riuscire.

Questo ignora i dettagli di ulteriori eccezioni sollevate negli stessi gestori di eccezioni, ad esempio connect(...) potrebbe non riuscire quando tenti di ristabilire la connessione, quindi dovresti gestirlo anche tu.