sql >> Base de Datos >  >> RDS >> PostgreSQL

psycopg2:cursor ya cerrado

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.