Закройте базу данных sqlite3 при выходе, несмотря ни на что

StackOverflow https://stackoverflow.com//questions/20014088

Вопрос

В настоящее время я пишу сценарий, использующий 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__ будет выполнен, и его можно будет безопасно закрыть.

Надеюсь это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top