何があっても、終了時にSQLite3データベースを閉じてください
-
21-12-2019 - |
質問
現在SQLite3を使用するスクリプトを書いています。私は最近、私のコードがエラーで早く出るために他のプログラムによって使用されているデータベースが問題になった。
同様の問題で、通常は使用します。
conn = sqlite3.connect(...)
try:
#Do stuff
finally:
conn.close()
.
しかし、これは私の訴訟では機能しません。一言で言えば、これは私のコードです:
IMPORT 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__
が実行され、安全に閉じることができます。
これが助けに役立つことを願っています!
所属していません StackOverflow