每个cursor.execute()后都需要connection.commit()吗?

时间:2018-01-24 18:44:19

标签: pymysql

在执行cursor.execute(…)之前多次向connection.commit()执行有效的PyMySQL操作,或者在每个执行语句之后是否需要connection.commit()才能正确存储结果?我们的想法是尽可能多地消除冗余语句,因为这个过程是长期运行的。

代码结构:

with connection.cursor() as cursor:
    …
    cursor.execute(SQLtype1, rowToInsert)

    cursor.execute(SQLtype2, otherToInsert)

    connection.commit() # does this account for both execute statements, or just the last?

我已经审核了以下内容:

PyMySQL execute/commit example,但只有一个示例只有一个执行语句。

Python MySQLdb example,但有一个示例显示每个执行语句后的提交

Python SQLite example,在提交之前显示多个执行语句,但不确定SQLite是否处理不同

注意:由于SQL查询不同,executemany似乎不是一个选项。

1 个答案:

答案 0 :(得分:2)

不,这是cursor.commit()的预期目的。您所描述的是自动提交,可能会也可能不会为您的数据库驱动程序启用。请查看其文档以确定。

如果您的第一个查询成功但第二个查询失败,您可能不希望您的数据库处于损坏状态,其中插入了某些行但其他行未插入。您执行的所有更改都将暂存,直到您使用cursor.commit()将它们提交到数据库。这允许您一次执行多个查询,并在其中一个失败时自动回滚更改。