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

Phi*_*lip 5 pymysql

cursor.execute(…)在执行之前多次执行有效的 PyMySQL 操作connection.commit(),还是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?
Run Code Online (Sandbox Code Playgroud)

我已经审查了以下内容:

PyMySQL 执行/提交示例,但只有一个示例只有一个执行语句。

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

Python SQLite 示例,显示提交前的多个执行语句,但不确定 SQLite 是否以不同方式处理

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

Ble*_*der 9

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

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

  • @菲利普:不完全是。假设您运行 PayBuddy,并且用户 A 向用户 B 发送 1,000 美元。您可以通过先减少用户 A 的余额,然后增加用户 B 的余额来做到这一点。这两个查询必须*都*成功,否则整个事务都会失败。您不能因为您的应用程序出现一些错误而让用户 A 丢失 100 美元而用户 B 没有收到它。您不应在两个查询之间提交更改,因为这会暂时使您的数据库处于不一致状态。如果您有无法部分执行的查询组,您希望*避免*自动提交。 (4认同)
  • 如果我理解你的意思,你是说我将通过在每个执行语句后调用 commit 来复制自动提交的功能。但是,使用自动提交以避免潜在的损坏状态可能更安全。 (2认同)