2017-01-28 28 views
1

私は動作していたコードがいくつかありますが、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のは、これはもはやケースです。」

私のコードを修正して明示的にデータベースをロックできるのはどういう意味ですか?

+0

Pythonのバージョンは同じですか?とにかく、[documentation](https://docs.python.org/3/library/sqlite3.html#controlling-transactions)を読んでください。 –

+0

良いキャッチ、Windowsでは、Pythonのバージョンは3.5.0にダウングレードされ、コードは完全に動作します。私は文書でこれを気付いた: "バージョン3.6で変更:sqlite3暗黙的にオープントランザクションをDDLステートメントの前にコミットするために使用されました。これはもはやケースです。しかし、私はこれが何を意味するのか、それをどう修正するのかを完全には理解していません。 conn._intransactionを実行すると、それは私に偽を与えます。 – Alecz

答えて

1

Pythonの自動トランザクション処理を使用する場合は、isolation_levelをデフォルト値のままにするか、3つのレベルのいずれかに設定します。

独自のトランザクション処理を行う場合は、isolation_levelNoneに設定して、Pythonが独自の処理を行わないようにする必要があります。

+0

これはうまくいくようです。私は 'isolation_level = '''が 'isolation_level = None'と同じではないことに気付かなかった – Alecz

1

これはバグです。 Python 3.6.1で修正される予定です。https://bugs.python.org/issue28518

+1

それを指摘してくれてありがとう。 X.X.0バージョンの使用には常にリスクがあると思います。サービスパックを待っていたはずです:) – Alecz

関連する問題