なぜPythonのDB-APIでの接続操作を「開始」していないのですか?
-
23-09-2019 - |
質問
私が呼び出すために使用されるのmysql-pythonの中のカーソルでの作業、および; "COMMIT"、 "BEGIN" "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を点検でも拡張のために、接続オブジェクトの開始()メソッドを言及します。
あなたがこの方法を使用するときにのMysql-pythonのは、やり方によって、DeprecationWarningをスローします。 sqlite3.connectionは、例えば、すべての方法を持っていません。
そしてPEPには、このような方法が存在しない理由の質問はありますか? )何とかオプションの文は、ある(コミット起動することが十分である代わりに?
解決 2
自分自身に答えることにしました。
DBのAPI 2.0トランザクションについてA スレッドする python-listと目立つブック SQLの完全なリファレンスのからの抜粋で私はDBのAPIの実装は、標準的な動作をSQL1だと思います。
SQL標準の最初のバージョン (SQL1)は暗黙的なトランザクションを定義しました トランザクションに基づくモード、 DB2の初期のリリースでサポートされています。 暗黙のモードでは、唯一のCOMMITおよび ROLLBACKステートメントがサポートされています。 A SQLトランザクションが自動的に開始されます 最初に実行されるSQL文を使用して、 ユーザーまたはプログラムおよび終了することにより COMMITまたはROLLBACKが実行されます。ザ・ 暗黙的に1つのトランザクションの終了 新しいものを開始します。
は明示的なトランザクションモード(SQL2とSQL:1999)。RDBSMサポートの自動コミットモードと現在の接続がそのモードであるが、DBのAPIはそれを反映していないときに便利なように思わ
他のヒント
を見 Aこれ以前に聞かれる質問。一般的に、トランザクションで使用する「プロトコル」は、次のとおりです。
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
のpython 2.6から始まっのsqlite Connection
オブジェクトが自動的にコミットまたはロールバックトランザクションにすることをコンテキストマネージャとして使用することができる。