Fermer une base de données sqlite3 à la sortie, peu importe ce que
-
21-12-2019 - |
Question
Je suis en train d'écrire un script qui utilise sqlite3.J'ai récemment rencontré un problème avec la base de données en cours d'utilisation par un autre programme à cause de mon code de sortie précoce avec une erreur.
Avec des problèmes similaires, en général on utilise:
conn = sqlite3.connect(...)
try:
#Do stuff
finally:
conn.close()
Mais cela ne fonctionne pas dans mon cas.En bref, c'est mon code:
import sqlite3
class Thingamadoodle:
def __init__(self, ...):
self.conn = sqlite3.connect(...)
...
#Methods and stuff
def __del__(self):
self.conn.close()
poop = Thingamadoodle(...)
poop.do_stuff(...)
poop.throw_irritating_exception_that_you_cant_track_down(irritatingness=11)
Une fois que le programme se ferme sans la fermeture de la connexion, j'obtiens une erreur lorsque je tente de modifier la base de données.
Est-il un moyen de fermer la connexion, même sur un impur sortie?
La solution
Pour être honnête, je ne comprends pas la question bien, mais pourquoi ne pas tout simplement enrouler le poop.do_stuff()
dans un try/except
bloc?
try:
poop.do_stuff()
except:
poop.__del__()
finally:
poop.__del__()
Ou pour être un peu plus propre, utilisez un gestionnaire de contexte:
class Thingamadoodle:
def __init__(self, ...):
...
#Methods and stuff
def __enter__(self):
self.conn = sqlite3.connect(...)
return self
def __exit__(self, errorType, errorValue, errorTrace):
self.conn.close()
Et juste l'exécuter en tant que:
with Thingmadoodle(args) as poop:
#do things
Après tout, le code est fait, ou après qu'une exception qui s'est passé dans la déclaration, __exit__
sera exécutée, et vous pouvez le fermer.
Espérons que cette aide!