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

时间:2010-03-30 16:38:55

标签: python sql python-db-api

使用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()?

2 个答案:

答案 0 :(得分:7)

a this previously asked question。通常,与事务一起使用的“协议”是:

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

从python 2.6 sqlite Connection objects can be used as context managers that automatically commit or rollback transactions开始。

答案 1 :(得分:4)

决定回答自己:

python-list中的thread about DB API 2.0 transactions以及明显的书SQL The Complete Reference中的以下摘录让我认为DB API实现了SQL1标准行为:

  

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

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