Pythonのsqlite3を使うときはcommitをお忘れなく
デバッグで3時間くらいはまったのでメモ.Python 2.5からSQLiteがデフォルトで使えるようになったので,SQLを使ったデータ処理が楽にできると思っていたが,思わぬ落とし穴が.
こちらのブログに書いてあるように,Pythonのsqlite3はデータを書いたら,必ずcommitメソッドを呼び出す必要がある.そうしないと,せっかく挿入したレコードが消失する恐れがある.Python 2.5のドキュメントには,なぜかclose()メソッドやcommit()メソッドが説明されていないが,2.6以降のドキュメントのclose()メソッドの説明には,
This closes the database connection. Note that this does not automatically call commit(). If you just close your database connection without calling commit() first, your changes will be lost!
とある.この仕様を回避し,自動的にコミットされるようにするには,Connectionオブジェクトのisolation_levelをNoneに設定する.
Pythonみたいな言語は何もしなくても必要な終了処理をしてくれるイメージなので,デフォルトがこういう仕様になっていると,はまる人が続出すると思う.
TrackBack URL :
Comments (2)
これは Pyton DB API の仕様です。pysqlite に限らずこの API に準拠したモジュールはみなデフォルトで auto-commit off になっています。
http://www.python.org/dev/peps/pep-0249/
–
commit()
Commit any pending transaction to the database. Note that
if the database supports an auto-commit feature, this must
be initially off. An interface method may be provided to
turn it back on.
コメント by Pyton DB API — 2009/2/14 土曜日 @ 14:22:53
コメントありがとうございます.承認が遅れてすみません.
へぇ~,こういうことが仕様としてPEPに書いてあって,それに準拠しただけだったとは知りませんでした.勉強になりました.
コメント by chokkan — 2009/3/2 月曜日 @ 0:18:11