8

mysql-pythonでのカーソルの操作は、「BEGIN;」、「COMMIT;」、および「ROLLBACK;」と呼んでいました。明示的に次のように:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")

次に、基になる接続オブジェクトに対応するメソッドがあることがわかりました。

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()

DB-API PEPを調べたところ、拡張機能であっても、接続オブジェクトのbegin()メソッドについては言及されていないことがわかりました。

ちなみに、Mysql-pythonは、メソッドを使用するとDeprecationWarningをスローします。たとえば、sqlite3.connectionにはメソッドがまったくありません。

そして問題は、なぜPEPにそのような方法がないのかということです。ステートメントはどういうわけかオプションですか、代わりにcommit()を呼び出すだけで十分ですか?

4

2 に答える 2

8

この以前の質問を見てください。通常、トランザクションで使用する「プロトコル」は次のとおりです。

cursor = conn.cursor()
try:
    cursor.execute(...)
except DatabaseError:
    conn.rollback()
    raise
else:
    conn.commit()
finally:
    cursor.close()

Python 2.6 以降、sqliteConnectionオブジェクトは、トランザクションを自動的にコミットまたはロールバックするコンテキスト マネージャーとして使用できます

于 2010-03-30T17:39:41.797 に答える
4

自分自身に答えることにしました:

python-list のDB API 2.0 トランザクションに関するスレッドと、著名な本SQL The Complete Referenceからの次の抜粋を見ると、DB API は SQL1 標準の動作を実装していると思います。

SQL 標準の最初のバージョン (SQL1) は、DB2 の初期リリースでのトランザクション サポートに基づいて、暗黙的なトランザクション モードを定義しました。暗黙モードでは、COMMIT および ROLLBACK ステートメントのみがサポートされます。SQL トランザクションは、ユーザーまたはプログラムによって実行される最初の SQL ステートメントで自動的に開始され、COMMIT または ROLLBACK が実行されると終了します。1 つのトランザクションが終了すると、暗黙的に新しいトランザクションが開始されます。

明示的なトランザクション モード (SQL2 および SQL:1999) は、RDBSM が自動コミット モードをサポートし、現在の接続がそのモードにある場合に便利なようですが、DB API はそれを反映しません。

于 2010-05-07T11:42:05.200 に答える