PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

psycopg2:cursor já fechado


Presumivelmente, se a conexão cair, você precisará restabelecê-la e obter outro cursor no manipulador de exceção:
for query in queries:
    try:
        cursor.execute(query)
    except Exception as e:
        print e.message
        conn = psycopg2.connect(....)
        cursor = conn.cursor()

Você deve ser mais específico com as exceções que você pegar. Assumindo um InterfaceError exceção se o cursor estiver de alguma forma fechado, você pode pegar isso assim:
except psycopg2.InterfaceError as e:

Pode haver outros problemas menos drásticos que impedirão a execução de consultas subsequentes, por exemplo, a transação é abortada. Nesse caso, você precisa reverter a transação atual e tentar a próxima 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()

Aqui, uma consulta é tentada em uma tabela inexistente. Um ProgrammingError exceção é levantada e a conexão deve ser revertida se outra consulta for tentada. A segunda consulta deve ser bem-sucedida.

Isso encobre os detalhes de outras exceções sendo levantadas nos próprios manipuladores de exceção, por exemplo, connect(...) pode falhar ao tentar restabelecer a conexão, então você deve lidar com isso também.