2008/11/19 水曜日

Pythonのsqlite3を使うときはcommitをお忘れなく

Filed under: Programing — chokkan @ 1:48:33

デバッグで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みたいな言語は何もしなくても必要な終了処理をしてくれるイメージなので,デフォルトがこういう仕様になっていると,はまる人が続出すると思う.

2件のコメント »

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

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

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

    コメント by chokkan — 2009/3/2 月曜日 @ 0:18:11

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.478 sec. Powered by WordPress ME