私は動作していたコードがいくつかありますが、WindowsでPython 3.6.0にアップグレードした後にエラーが発生しています。同じコードがPython 3.5.2でうまく動作することを確認できます。Python3 sqlite3 BEGIN IMMEDIATEエラー
>>> cur.execute('BEGIN IMMEDIATE')
<sqlite3.Cursor object at 0xb710ab60>
:
>>> import sqlite3
>>> conn = sqlite3.connect('testDB.db')
>>> cur = conn.cursor()
>>> conn.in_transaction
False
>>> cur.execute('BEGIN IMMEDIATE')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: cannot start a transaction within a transaction
同じコードは、Python 3.5.2と何の問題を持っていない:私は明示的にデータベース上の書き込みロックを設定しようとしていた中で次のように非常に単純なコードにまで問題を狭め
私はconn = sqlite3.connect('testDB.db', isolation_level='IMMEDIATE')
を成功裏に使用しようとしました。私はINSERTやSELECTのようなトランザクションをしていないことに注意してください。
UPDATE: 私は、Python sqlite3 documentationで次のように気づいていない:
「バージョン3.6で変更:暗黙的にDDL文の前に開いているトランザクションをコミットするために使用さsqlite3のは、これはもはやケースです。」
私のコードを修正して明示的にデータベースをロックできるのはどういう意味ですか?
Pythonのバージョンは同じですか?とにかく、[documentation](https://docs.python.org/3/library/sqlite3.html#controlling-transactions)を読んでください。 –
良いキャッチ、Windowsでは、Pythonのバージョンは3.5.0にダウングレードされ、コードは完全に動作します。私は文書でこれを気付いた: "バージョン3.6で変更:sqlite3暗黙的にオープントランザクションをDDLステートメントの前にコミットするために使用されました。これはもはやケースです。しかし、私はこれが何を意味するのか、それをどう修正するのかを完全には理解していません。 conn._intransactionを実行すると、それは私に偽を与えます。 – Alecz