Python操作MySQL:执行Commit后更新记录仍不生效的问题
问题现象
INSERT语句执行正常,但将product_status设为3的UPDATE语句,虽然rowcount显示为1,但数据库中数据无变化;直接在TablePlus执行相同逻辑的UPDATE语句可正常生效,且将product_status设为1时代码中的UPDATE语句能正常更新。
排查与解决步骤
确认事务提交有效性
虽然代码中调用了connection.commit(),但可显式设置连接的autocommit属性为False,确保事务控制完全由手动提交主导:connection = mysql.connector.connect( host=host, user=user, use_unicode=True, password=password, database=db_name, autocommit=False # 显式关闭自动提交 )执行UPDATE后,打印
connection.is_connected()确认连接未意外断开,避免提交失效。验证WHERE条件的匹配准确性
虽然rowcount返回1,但可能是代码中传入的shop_url与数据库中实际存储的值存在细微差异(比如首尾空格、大小写、编码差异)。可以在执行UPDATE后,执行一次查询验证匹配的记录:cursor.execute("SELECT product_status FROM {} WHERE shop_url = %s".format(TABLE_FETCH), (shop_url,)) result = cursor.fetchone() print("当前字段值:", result) # 查看实际查询到的product_status值同时检查数据库表的字符集是否为
utf8mb4,避免因编码不一致导致匹配异常。检查数据库触发器或约束
排查目标表是否存在触发器,比如当product_status被更新为3时,触发器自动将其改回原值;或者表存在某种约束限制product_status的取值(虽然直接执行SQL能生效,但需确认触发器是否仅在特定条件下触发)。更换游标类型测试
尝试使用DictCursor游标,避免默认游标可能存在的缓存或数据同步问题:from mysql.connector.cursor import DictCursor with connection.cursor(DictCursor) as cursor: sql = "UPDATE {} set product_status = 3 where shop_url = %s ".format(TABLE_FETCH) cursor.execute(sql, (shop_url,)) connection.commit()打印完整执行日志
开启mysql.connector的查询日志,查看实际发送到数据库的SQL语句和参数,确认与手动执行的语句完全一致:import logging logging.basicConfig(level=logging.DEBUG)
内容的提问来源于stack exchange,提问作者Volatil3

