Presumiblemente, si la conexión se ha interrumpido, deberá restablecerla y obtener otro cursor en el controlador de excepciones:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
Debería ser más específico con las excepciones que detecta. Asumiendo un InterfaceError
excepción si el cursor está cerrado de alguna manera, puede detectarlo así:
except psycopg2.InterfaceError as e:
Puede haber otros problemas menos drásticos que impidan la ejecución de consultas posteriores, p. la transacción es abortada. En ese caso, debe revertir la transacción actual y luego intentar la siguiente consulta:
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()
Aquí se prueba una consulta contra una tabla inexistente. Un ProgrammingError
se genera una excepción, y la conexión debe revertirse si se va a intentar otra consulta. La segunda consulta debería tener éxito.
Esto pasa por alto los detalles de más excepciones que se generan en los propios controladores de excepciones, por ejemplo, connect(...)
podría fallar al intentar restablecer la conexión, por lo que también debe manejar eso.