Feche um banco de dados sqlite3 ao sair, não importa o que aconteça
-
21-12-2019 - |
Pergunta
Atualmente estou escrevendo um script que usa sqlite3.Recentemente, tive um problema com o banco de dados sendo usado por outro programa devido ao meu código ter sido encerrado antecipadamente com um erro.
Com problemas semelhantes, geralmente usa-se:
conn = sqlite3.connect(...)
try:
#Do stuff
finally:
conn.close()
Mas isso não funcionará no meu caso.Resumindo, este é o meu código:
importar 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)
Depois que o programa é encerrado sem fechar a conexão, recebo erros ao tentar modificar o banco de dados.
Existe uma maneira de fechar a conexão com segurança, mesmo em uma saída suja?
Solução
Para ser honesto, não entendo muito a pergunta, mas por que não encerrar o poop.do_stuff()
em um try/except
bloquear?
try:
poop.do_stuff()
except:
poop.__del__()
finally:
poop.__del__()
Ou para ser um pouco mais limpo, use um gerenciador de contexto:
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()
E basta executá-lo como:
with Thingmadoodle(args) as poop:
#do things
Depois que todo o código estiver pronto, ou após uma exceção acontecer na instrução, __exit__
será executado e você poderá fechá-lo com segurança.
Espero que isto ajude!