デフォルトでは、sqlite3 モジュールはデータ変更言語(DML)文(すなわち INSERT/UPDATE/DELETE/REPLACE)の前に暗黙のうちにトランザクションを開始し、 非DML、非クエリ文(すなわち SELECT/INSERT/UPDATE/DELETE/REPLACE のいずれでも ないもの)の前にトランザクションをコミットします。
ですから、もしトランザクション中に CREATE TABLE ...
, VACUUM
,
PRAGMA
といったコマンドを発行すると、sqlite3 モジュールはその
コマンドの実行前に暗黙のうちにコミットします。このようにする理由は二つあります。
第一にこうしたコマンドのうちの幾つかはトランザクション中ではうまく動きません。
第二に pysqlite はトランザクションの状態(トランザクションが掛かっているかどうか)を
追跡する必要があるからです。
pysqlite が暗黙のうちに実行する"BEGIN"文の種類(またはそういうものを使わないこと)を connect 呼び出しの isolation_level パラメータを通じて、または 接続の isolation_level プロパティを通じて、制御することができます。
もし自動コミットモードが使いたければ、isolation_level は None にしてください。
そうでなければデフォルトのまま"BEGIN"文を使い続けるか、SQLite がサポートする分離レベル DEFERRED, IMMEDIATE または EXCLUSIVE を設定してください。
sqlite モジュールがトランザクション状態を把握する必要があるの
で、SQL の中で OR ROLLBACK
や ON CONFLICT ROLLBACK
を使っ
てはなりません。その代わりに、IntegrityError を捕捉して接続
のrollback メソッドを自分で呼び出すようにしてください。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。