数据库不会使用MySQL和Python自动更新

数据库不会使用MySQL和Python自动更新,python,mysql,mysql-python,Python,Mysql,Mysql Python,我在更新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 co

我在更新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,其中ID=100;数据库按预期更新


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

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

在调用close之前调用conn.commit


在常见问题解答中:

您需要手动提交更改或启用自动提交


SELECT返回已修改但未持久化的数据的原因是,连接仍在同一事务中。

我发现Python的连接器会自动关闭自动提交,并且似乎没有任何方法可以更改此行为。当然,您可以将其重新打开,但查看查询日志,它会愚蠢地在连接后执行两个无意义的查询,以关闭自动提交,然后再打开。

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

您可以像其他人指出的那样在update语句之后执行conn.commit,也可以在创建连接对象之后立即设置conn.autocommitTrue来完全禁用此功能

连接到数据库时,可以直接打开自动提交:

将mysql.connector作为数据库导入 conn=db.connecthost=localhost,user=root,passwd=pass,db=dbname,autocommit=True 或单独:

导入MySQLdb conn=MySQLdb.connecthost=localhost,user=root,passwd=pass,db=dbname 光标=连接光标 conn.get\u自动提交将返回**False** conn.autocommit=True conn.get\u自动提交应立即返回**True** 光标=连接光标 显式提交更改是通过

康涅狄格州
连接后设置conn.autocommittrue意味着它会向服务器发送两个多余的命令-如果有办法避免它们会更好。但这并不是一个昂贵的声明。昂贵是一个意见的问题。。。如果你的服务器离你有一段距离,你仍然有两次不必要的往返。我在一个命令后执行了显式conn.commit,行数表示一切正常,但在该应用程序之外查看时,它失败了。将其设置为自动提交就成功了。不知道这是不是一个错误:但谢谢你-帮了我很多!!我觉得它很方便,因为如果出现问题,您不必手动管理回滚。如果您需要多个查询来更新数据库,我想知道为什么我在mysql中启用了自动提交,但还需要conn.commit?