为什么Python的DB-API中的连接没有"开始"操作?

new*_*ver 8 python sql python-db-api

使用mysql-python中的游标我曾经称之为"BEGIN;","COMMIT;"和"ROLLBACK;" 明确如下:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")
Run Code Online (Sandbox Code Playgroud)

然后,我发现底层连接对象有相应的方法:

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()
Run Code Online (Sandbox Code Playgroud)

检查DB-API PEP我发现它没有提到连接对象的begin()方法,即使对于扩展也是如此.

顺便说一下,当您使用该方法时,Mysql-python会抛出DeprecationWarning.例如,sqlite3.connection根本就没有这个方法.

问题是为什么PEP中没有这样的方法?该语句是否可选,是否足以调用commit()?

mg.*_*mg. 7

看看这个先前提出的问题.通常,与事务一起使用的"协议"是:

cursor = conn.cursor()
try:
    cursor.execute(...)
except DatabaseError:
    conn.rollback()
    raise
else:
    conn.commit()
finally:
    cursor.close()
Run Code Online (Sandbox Code Playgroud)

从python 2.6开始,sqlite Connection对象可以用作自动提交或回滚事务的上下文管理器.

  • 根据文档,它似乎应该是`conn.rollback()`,`conn.commit()`而不是`cursor.rollback()`,`cursor.commit()`.我错过了什么吗? (2认同)

new*_*ver 4

决定回答自己:

python-list 中关于 DB API 2.0 事务的线程以及以下摘自著名书籍《SQL The Complete Reference》的摘录让我认为 DB API 实现了 SQL1 标准行为:

SQL 标准的第一个版本 (SQL1) 基于 DB2 早期版本中的事务支持定义了隐式事务模式。在隐式模式下,仅支持 COMMIT 和 ROLLBACK 语句。SQL 事务自动从用户或程序执行的第一个 SQL 语句开始,并在执行 COMMIT 或 ROLLBACK 时结束。一笔交易的结束隐含地开始了一笔新交易。

当 RDBSM 支持自动提交模式并且当前连接处于该模式时,显式事务模式(SQL2 和 SQL:1999)似乎很方便,但 DB API 没有反映它。