Закройте базу данных sqlite3 при выходе, несмотря ни на что
-
21-12-2019 - |
Вопрос
В настоящее время я пишу сценарий, использующий sqlite3.Недавно я столкнулся с проблемой, связанной с тем, что база данных используется другой программой из-за досрочного завершения моего кода с ошибкой.
При подобных проблемах обычно используют:
conn = sqlite3.connect(...)
try:
#Do stuff
finally:
conn.close()
Но в моем случае это не сработает.Вкратце, это мой код:
импортировать 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)
После того, как программа завершает работу, не закрывая соединение, я получаю ошибки при попытке изменить базу данных.
Есть ли способ безопасно закрыть соединение даже на нечистом выходе?
Решение
Честно говоря, я не очень понимаю вопрос, но почему бы просто не завернуть poop.do_stuff()
в try/except
блокировать?
try:
poop.do_stuff()
except:
poop.__del__()
finally:
poop.__del__()
Или, чтобы быть немного понятнее, используйте контекстный менеджер:
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()
И просто выполните его как:
with Thingmadoodle(args) as poop:
#do things
После завершения всего кода или после возникновения исключения в операторе __exit__
будет выполнен, и его можно будет безопасно закрыть.
Надеюсь это поможет!