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.