为什么Python的DB-API连接没有“开始”的操作?
-
23-09-2019 - |
题
工作与在MySQL-蟒我用来调用游标 “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 我发现它不提供连接对象的开头()方法,即使是扩展。
的MySQL蟒,顺便说一下,投DeprecationWarning,当您使用的方法。 sqlite3.connection,例如,不具有在所有的方法。
和的问题是为什么没有在PEP没有这样的方法?是语句不知何故可选的,它足以调用提交()呢?
解决方案 2
决定回答自己:
一个螺纹约DB API 2.0交易的在python列表,并从书中明显 SQL完全参考以下摘录让我觉得DB API工具SQL1标准的行为:
SQL标准的第一个版本 (SQL1)定义的隐式事务 模式,基于交易 支持DB2的早期版本。 在隐式模式下,只有COMMIT和 ROLLBACK语句的支持。一种 SQL事务会自动开始 与执行的第一个SQL语句 由用户或程序和结束时 COMMIT或执行回滚。该 一个事务的隐式结束 开始一个新的。
显式交易模式(SQL2和SQL:1999)。似乎是得心应手当RDBSM支持自动提交模式和当前的连接是在该模式下,但DB API只是不反映它
其他提示
这以前问问题。通常,“协议”与交易使用的是:
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
这蟒开始2.6 源码Connection
对象可以被用作上下文管理器可以自动提交或回滚事务的。
不隶属于 StackOverflow