You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python操作MySQL:执行Commit后更新记录仍不生效的问题

MySQL UPDATE语句设为3不生效的排查与解决

问题现象

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:57:38