記事一覧:2009年11月26日

python_sqlite3_commit

 Pythonにはsqlite3という、SQLiteのインターフェイスモジュールがあるんだけど、Python 2.5の日本語ドキュメントのとおりやろうとすると微妙にハマる、という話。

 日本語ドキュメントのsqlite3ページには、以下のようなコード例が載ってます。

c = conn.cursor()

# Create table
c.execute('''create table stocks
(date text, trans text, symbol text,
 qty real, price real)''')

# Insert a row of data
c.execute("""insert into stocks
          values ('2006-01-05','BUY','RHAT',100,35.14)""")

 ところが、これだと実際にはinsertがデータベースに反映されない。実はinsertなどの操作を行った最後に、sqlite3.Connectionオブジェクトのcommit()メソッドを行わないとコミットが行われず、変更が実行されない模様。

 で、実はPython 2.5.2ドキュメントのsqlite3ページには、このあとに以下のようなコードが追加されております。

# Save (commit) the changes
conn.commit()

# We can also close the cursor if we are done with it
c.close()

 にも関わらず、「Connection Object」のページにはcommit()に関する記述がないのでさらに混乱は深まる……。ちなみに、Python 2.6.4のドキュメントではちゃんとcommit()メソッドについて記述されており、commit()を実行しないとデータベースへの変更が行われないよ、またrollback()メソッドを実行すれば前回のcommit()までの内容を取り消せるよ、との旨が書かれてます。

 教訓:日本語ドキュメントを当てにせず、ちゃんと原文を読め。