Schließen Sie eine SQLite3-Datenbank beim Beenden, egal was passiert
-
21-12-2019 - |
Frage
Ich schreibe gerade ein Skript, das sqlite3 verwendet.Ich hatte kürzlich ein Problem damit, dass die Datenbank von einem anderen Programm verwendet wurde, weil mein Code vorzeitig mit einem Fehler beendet wurde.
Bei ähnlichen Problemen verwendet man normalerweise:
conn = sqlite3.connect(...)
try:
#Do stuff
finally:
conn.close()
Aber das wird in meinem Fall nicht funktionieren.Kurz gesagt, das ist mein Code:
sqlite3 importieren
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)
Nachdem das Programm beendet wurde, ohne die Verbindung zu schließen, erhalte ich Fehlermeldungen, wenn ich versuche, die Datenbank zu ändern.
Gibt es eine Möglichkeit, die Verbindung auch bei einem unsauberen Ausgang sicher zu schließen?
Lösung
Um ehrlich zu sein, verstehe ich die Frage nicht besonders, aber warum nicht einfach einpacken poop.do_stuff()
in einem try/except
Block?
try:
poop.do_stuff()
except:
poop.__del__()
finally:
poop.__del__()
Oder um es etwas übersichtlicher zu gestalten, verwenden Sie einen Kontextmanager:
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()
Und führen Sie es einfach wie folgt aus:
with Thingmadoodle(args) as poop:
#do things
Nachdem der gesamte Code fertig ist oder eine Ausnahme in der Anweisung aufgetreten ist, __exit__
wird ausgeführt und Sie können es sicher schließen.
Hoffe das hilft!