【问题标题】:Database does not update automatically with MySQL and Python数据库不会使用 MySQL 和 Python 自动更新
【发布时间】:2010-09-27 21:46:11
【问题描述】:

我在更新 MySQL 数据库中的行时遇到了一些问题。这是我要运行的代码:

import MySQLdb

conn=MySQLdb.connect(host="localhost", user="root", passwd="pass", db="dbname")
cursor=conn.cursor()

cursor.execute("UPDATE compinfo SET Co_num=4 WHERE ID=100")
cursor.execute("SELECT Co_num FROM compinfo WHERE ID=100")
results = cursor.fetchall()

for row in results:
    print row[0]

print "Number of rows updated: %d" % cursor.rowcount

cursor.close()
conn.close()

我运行这个程序时得到的输出是:

4
更新的行数:1

看起来它正在工作,但如果我从 MySQL 命令行界面 (CLI) 查询数据库,我发现它根本没有更新。但是,如果我从 CLI 输入 UPDATE compinfo SET Co_num=4 WHERE ID=100;,则数据库会按预期更新。

我的问题是什么?我在 Windows 机器上运行 Python 2.5.2 和 MySQL 5.1.30。

【问题讨论】:

    标签: python mysql mysql-python


    【解决方案1】:

    我不确定,但我猜你正在使用 INNODB 表,而你还没有提交。我相信 MySQLdb 会自动启用事务。

    在拨打close之前先拨打conn.commit()

    来自常见问题解答:Starting with 1.2.0, MySQLdb disables autocommit by default

    【讨论】:

    • 我觉得它很方便,因为如果出现问题,您不必手动管理回滚。如果您需要多个查询来更新数据库。
    【解决方案2】:

    您需要手动提交更改或打开自动提交。

    SELECT 返回修改后(但不是持久化)数据的原因是连接仍在同一个事务中。

    【讨论】:

    • 我想知道为什么我在 mysql 中打开了自动提交但也需要conn.commit()
    【解决方案3】:

    我发现 Python 的连接器会自动关闭自动提交功能,而且似乎没有任何方法可以改变这种行为。当然你可以重新打开它,但是然后查看查询日志,它在连接后愚蠢地执行了两个毫无意义的查询以关闭自动提交然后重新打开。

    【讨论】:

      【解决方案4】:

      MySQLdb 默认关闭自动提交功能,一开始可能会让人感到困惑。您的连接存在于它自己的事务中,在您提交该事务之前,您将无法看到您从其他连接所做的更改。

      您可以像其他人指出的那样在更新语句之后执行conn.commit(),或者通过在创建连接对象后立即设置conn.autocommit(True) 来完全禁用此功能。

      【讨论】:

      • 在连接后设置 conn.autocommit(true) 意味着它会向服务器发送两个多余的命令——如果有办法避免它们会更好。
      • 如果有这样的方法更好,我同意。但这并不像是一个昂贵的声明。
      • 贵是见仁见智...如果您的服务器距离较远,您仍然需要进行两次不必要的往返。
      • 我在命令后做了一个明确的 conn.commit ,行数说一切正常,但在该应用程序之外查看它,它失败了。将其设置为自动提交就可以了。不知道这是否是一个错误:但感谢 ʞɔıu -- 帮了我很多!
      【解决方案5】:

      Connector/Python Connection Arguments

      连接数据库时可以直接开启自动提交:

      import mysql.connector as db
      conn = db.connect(host="localhost", user="root", passwd="pass", db="dbname", autocommit=True)
      

      MySQLConnection.autocommit Property

      或单独:

      import MySQLdb
      
      conn = MySQLdb.connect(host="localhost", user="root", passwd="pass", db="dbname")
      cursor = conn.cursor()
      conn.get_autocommit()        # will return **False**
      conn.autocommit = True
      conn.get_autocommit()        # Should return **True** now
      cursor = conn.cursor()
      

      显式提交更改是通过

      conn.commit()
      

      【讨论】:

        【解决方案6】:

        我必须在我的 mysqlWorkbench 应用脚本上执行 SET autocommit=true

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2012-04-10
          • 2019-07-01
          • 2017-05-01
          • 1970-01-01
          相关资源
          最近更新 更多