Presumibilmente, se la connessione è sceso si avrebbe bisogno di ristabilire e ottenere un altro cursore nel gestore di eccezioni:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
si dovrebbe essere più specifico con le eccezioni che si cattura. Supponendo un'eccezione InterfaceError
se il cursore è in qualche modo chiuso si può prendere che in questo modo:
except psycopg2.InterfaceError as e:
Ci possono essere altri problemi meno drastiche che impediscono l'esecuzione di query successive da, per esempio la transazione è stata interrotta. In questo caso è necessario eseguire il rollback la 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()
Ecco una query viene provato su una tabella inesistente. Viene sollevata un'eccezione ProgrammingError
e la connessione deve essere ripristinata se si tenta di tentare un'altra query. La seconda query dovrebbe avere successo.
Questo spiega i dettagli di ulteriori eccezioni sollevate negli stessi gestori di eccezioni, ad es. connect(...)
potrebbe non riuscire nel tentativo di ristabilire la connessione, quindi dovresti gestirlo anche tu.
controllare questo collegamento potrebbe essere utile per voi http://stackoverflow.com/questions/1281875/making-sure-that-psycopg2-database-connection-alive –