Cerrar una base de datos sqlite3 en la salida, no importa lo que
-
21-12-2019 - |
Pregunta
Actualmente estoy escribiendo un guión que utiliza sqlite3.Recientemente me encontré con un problema con la base de datos está en uso por otro programa, debido a que el código de salir temprano con un error.
Con problemas similares, por lo general se utiliza:
conn = sqlite3.connect(...)
try:
#Do stuff
finally:
conn.close()
Pero esto no funciona en mi caso.En pocas palabras, este es mi código:
importación de 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)
Después de que el programa se cierra sin cerrar la conexión, me da errores al intentar modificar la base de datos.
¿Hay una forma segura de cerrar la conexión, incluso en un inmundo salir?
Solución
Para ser honesto, no entiendo la pregunta mucho, pero ¿por qué no simplemente envuelva la poop.do_stuff()
en un try/except
bloque?
try:
poop.do_stuff()
except:
poop.__del__()
finally:
poop.__del__()
O para ser un poco más limpio, utilice un contexto manager:
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()
Y sólo ejecutarlo como:
with Thingmadoodle(args) as poop:
#do things
Después de todo el código está hecho, o después de una excepción ocurrió en la declaración, __exit__
va a ser ejecutado, y usted puede de manera segura cerca de ella.
Espero que esto ayude!