PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

psycopg2 :curseur déjà fermé

Vraisemblablement, si la connexion a été interrompue, vous devrez la rétablir et obtenir un autre curseur dans le gestionnaire d'exception :

for query in queries:
    try:
        cursor.execute(query)
    except Exception as e:
        print e.message
        conn = psycopg2.connect(....)
        cursor = conn.cursor()

Vous devriez être plus précis avec les exceptions que vous attrapez. En supposant une InterfaceError exception si le curseur est fermé d'une manière ou d'une autre, vous pouvez l'attraper comme ceci :

except psycopg2.InterfaceError as e:

Il peut y avoir d'autres problèmes moins drastiques qui empêcheront l'exécution des requêtes suivantes, par ex. la transaction est annulée. Dans ce cas, vous devez annuler la transaction en cours, puis essayer la requête suivante :

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()

Ici, une requête est tentée sur une table inexistante. Une ProgrammingError une exception est déclenchée et la connexion doit être annulée si une autre requête doit être tentée. La deuxième requête devrait réussir.

Cela passe sous silence les détails des autres exceptions déclenchées dans les gestionnaires d'exceptions eux-mêmes, par exemple connect(...) peut échouer lors de la tentative de rétablissement de la connexion, vous devez donc également gérer cela.