La fermeture d'un cx_Oracle de Connexion, Tout en Permettant une mise de Base de données
Suivantes cx_Oracle
code fonctionne très bien lorsque la base de données est:
#!C:\Python27
import cx_Oracle
try:
conn = cx_Oracle.connect("scott/tiger@oracle")
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 lorsque j'exécute ce script, un NameError
est soulevée:
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 fait sens pour moi: cx_Oracle
n'était pas en mesure d'instancier une connexion, de sorte que la variable conn
ne l'ai jamais mis, et n'a donc aucun close()
méthode.
En Python, quelle est la meilleure façon de vous assurer de votre connexion de base de données se ferme, tandis que toujours gracieusement de la manipulation de l'état d'une baisse de la base de données?
De faire quelque chose comme ce qui suit semble comme un énorme bidouille pour moi:
finally:
try:
conn.close()
except NameError:
pass
OriginalL'auteur Art Metzer | 2011-03-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de l'initialisation
conn
à quelque chose commeNone
avant-main et d'essai dans lefinally
bloc. Cela fonctionne parce que le seul endroit où la connexion est autre chose, c'est quand il est ouvert. Ainsi ouvert implique la non-None
etNone
implique la non-ouvert:OriginalL'auteur Mad Physicist
(pas exactement une réponse, mais les commentaires n'ont pas de belles mise en forme)
Essayez ceci:
Pas l'idéal, mais devrait mieux fonctionner. Je me demande aussi pourquoi autant de nidification. Pourquoi ne pas faire ça:
BTW, j'ai cette hypothèse que la connexion et le curseur se fermer automatiquement sur la sortie, en supprimant la nécessité de fermer explicitement.
OriginalL'auteur Tshepang