Python MySQLdb 更新查询失败

14 投票
2 回答
16175 浏览
提问于 2025-04-15 12:25

好的,我这里做了一个MySQL查询浏览器,类似于navicat。使用MySQLdb来执行查询。

这里有个奇怪的地方。当我通过程序运行查询(使用MySQLdb)时,它告诉我成功了,受影响的行数是1,但当我在phpmyadmin查看时,值并没有改变。

所以在我执行查询之前,我把查询打印出来,复制粘贴到phpmyadmin的查询窗口,点击执行就能成功。所以简单来说,更新查询没有效果,但当我复制粘贴到phpmyadmin时,它就能正常工作。

self.tbl.sql.use(self.tbl.database)       # switches to correct database. I've printed this and it uses the corrected db
if self.tbl.sql.execute(query) == True:
    print sql_obj.rows_affected()         # returns 1 (since i only do 1 query)

这是SQL类的一部分

def execute(self, query):

    try:
        self.cursor.execute(query)
        return True
    except MySQLdb.ProgrammingError as error:
        print "---->SQL Error: %s" % error
        return False
    except MySQLdb.IntegrityError as e:
        print "--->SQL Error: %s" % e    
        return False

那么,有什么想法可能发生了什么吗?

2 个回答

20

我觉得@Jason Creighton和@S.Lott说得对。

至少如果你要更新的表是在一个支持事务的存储引擎上。InnoDB是支持事务的,而ISAM则不是。

你要么在关闭连接之前调用commit(),要么就得把连接设置为自动提交模式。我不太确定在MySQLdb连接中怎么做,我想你可以在创建连接的时候设置一个参数,或者在创建连接对象后设置一个属性。

大概是这样的:

conn = mysql.connection(host, port, autocommit=True)

# or
conn = mysql.connection(host, port)
conn.autocommit(True)
16

我猜测:也许这段Python代码是在一个事务中运行的,而这个事务可能需要被明确地提交?

补充:在MySQLdb的常见问题解答中,有一条可能相关的内容

撰写回答