Python操作MySQL时UPDATE SET语句无法正常更新数据问题求解
错误原因及修复方案
核心错误原因
- 未执行事务提交:你的INSERT代码段里调用了
db.commit()写入数据,但UPDATE执行完成后没有加事务提交语句,关系型数据库默认开启事务,未提交的修改只会保存在会话缓存中,不会持久化到表中,所以看不到更新结果。 - id解析逻辑冗余且易出错:
cursor.fetchall()返回的是嵌套元组,你查到id后直接取id[0][0]就能拿到原生的id整数值,不需要转成字符串再过滤括号、逗号,很容易因为格式问题传入错误值导致更新匹配失败。 - 双重循环+反复查询数据库逻辑不合理:两次全表查询后嵌套循环匹配,匹配到还要再查一次id,不仅执行效率极低,也容易因为游标复用、结果集遍历问题导致逻辑异常。
快速修复方案(兼容原有逻辑)
在原有逻辑基础上优化冗余代码、补充事务提交即可生效:
if bollean_nodata != True: # 提前把ExistingItems的name和id存成字典,避免反复查询数据库 name_id_map = {} query = "SELECT nameItem, id FROM ExistingItems;" mycursor.execute(query) for name, item_id in mycursor.fetchall(): name_id_map[name] = item_id # 遍历待更新的MARCT记录 for (nameItem,) in myresult: if nameItem in name_id_map: query = "UPDATE MARCT SET samevalue = %s WHERE nameItem = %s;" data = (name_id_map[nameItem], nameItem) mycursor.execute(query, data) # 所有更新执行完统一提交事务,比单次提交执行效率更高 db.commit()
更优方案(单SQL实现,无需循环)
你的需求完全可以用一条UPDATE JOIN语句实现,不需要在Python层面循环处理,执行效率高还不会出现事务漏提交的问题:
query = """ UPDATE MARCT m INNER JOIN ExistingItems e ON m.nameItem = e.nameItem SET m.samevalue = e.id WHERE m.samevalue IS NULL; """ mycursor.execute(query) db.commit()
内容的提问来源于stack exchange,提问作者Semi
相关产品推荐
相关产品推荐

