3

Le code cx_Oracle suivant fonctionne très bien lorsque la base de données est:Fermeture d'une connexion cx_Oracle tout en permettant une base de données vers le bas

#!C:\Python27 
import cx_Oracle 

try: 
    conn = cx_Oracle.connect("scott/[email protected]") 

    try: 
     curs = conn.cursor() 
     curs.execute("SELECT dummy FROM sys.dual") 
     print curs.fetchone()[0] 
    finally: 
     curs.close() 
finally: 
    conn.close() 

Mais si la base de données se trouve être vers le bas quand je lance ce script, un NameError est élevé :

Traceback (most recent call last): 
    File "C:\Users\ArtMetzer\Documents\Code\Python\db_conn_test.py", line 14, in <module> 
    conn.close() 
NameError: name 'conn' is not defined 

Cela me paraît logique: cx_Oracle n'a pas pu instancier une connexion, de sorte que la conn variables ne se est fixé, et n'a donc pas de méthode close().

En Python, quelle est la meilleure façon de vous assurer que votre connexion à la base de données se ferme, tout en gérant avec élégance l'état d'une base de données?

Faire quelque chose comme ce qui suit semble être une bidouille massive pour moi:

finally: 
    try: 
     conn.close() 
    except NameError: 
     pass 

Répondre

-2

(pas exactement une réponse, mais les commentaires n'ont pas belle mise en forme)

Essayez ceci:

#!C:\Python27 
import cx_Oracle 

try: 
    conn = cx_Oracle.connect("scott/[email protected]") 

    try: 
     curs = conn.cursor() 
     curs.execute("SELECT dummy FROM sys.dual") 
     print curs.fetchone()[0] 
    finally: 
     curs.close() 
     conn.close() 
except Exception as e: 
    print e 

Pas idéal, mais devrait fonctionner mieux. Je me demande aussi pourquoi autant de nidification. Pourquoi ne pas le faire:

#!C:\Python27 
import cx_Oracle 

try: 
    conn = cx_Oracle.connect("scott/[email protected]") 
    curs = conn.cursor() 
    curs.execute("SELECT dummy FROM sys.dual") 
    print curs.fetchone()[0] 
    curs.close() 
    conn.close() 
except Exception as e: 
    print e 

BTW, j'ai cette hypothèse que la connexion et le curseur se ferment automatiquement à la sortie, en supprimant la nécessité de les fermer explicitement.

+0

Dans le dernier exemple, curs.close() et conn.close() ne serait jamais appelé si curs.execute() a échoué. Cependant, je parie que tout serait nettoyé pendant la sortie. Il faudrait vérifier les connexions actives dans Oracle pour voir si la connexion a été nettoyée. – Doug

4

Vous pouvez essayer d'initialiser conn à quelque chose comme None auparavant et de tester cela dans le bloc finally. Cela fonctionne parce que le seul endroit où la connexion est définie sur autre chose est quand il est ouvert. Ainsi, ouvert implique non None et None implique non-ouvert:

#!C:\Python27 
import cx_Oracle 

conn = None 
try: 
    conn = cx_Oracle.connect("scott/[email protected]") 

    try: 
     curs = conn.cursor() 
     curs.execute("SELECT dummy FROM sys.dual") 
     print curs.fetchone()[0] 
    finally: 
     curs.close() 
finally: 
    if conn is not None: 
     conn.close() 
Questions connexes