« | »

2008.11.19

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

Comment & Trackback

これは 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.

コメントありがとうございます.承認が遅れてすみません.

へぇ~,こういうことが仕様としてPEPに書いてあって,それに準拠しただけだったとは知りませんでした.勉強になりました.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>