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

Python脚本更新MySQL表行设contact_id为NULL时遇“未读取结果”错误

解决MySQL Python脚本“Error: Unread result found”问题

错误原因

这个错误是因为当前数据库游标存在未读取完毕的查询结果集,MySQL默认游标会在执行SELECT类查询后保留结果,必须先处理完所有结果,才能执行后续的UPDATE等写操作。

解决方案

1. 手动读取完之前的结果集

检查脚本中执行UPDATE之前的代码,如果有使用游标执行过SELECT查询,必须调用fetchall()或fetchone()读取所有结果,再执行UPDATE。

示例:

# 之前的查询代码
cursor.execute("SELECT COUNT(*) FROM aos_products WHERE contact_id=1")
# 读取结果,避免残留未处理的结果集
result = cursor.fetchone()[0]

# 之后再执行UPDATE
if result == 0:
    query = "UPDATE aos_products SET contact_id=NULL WHERE contact_id=1"
    cursor.execute(query)
    connection.commit()
    # 后续日志代码...

2. 使用缓冲游标

创建游标时指定buffered=True,让游标自动缓存所有查询结果,无需手动处理也不会阻塞后续操作。

示例:

# 创建连接后,初始化缓冲游标
cursor = connection.cursor(buffered=True)

# 后续执行查询和UPDATE都不会出现未读结果的问题
if result == 0:
    query = "UPDATE aos_products SET contact_id=NULL WHERE contact_id=1"
    cursor.execute(query)
    connection.commit()
    # 后续日志代码...

3. 确保提交事务

对于InnoDB等支持事务的存储引擎,执行UPDATE后需要手动调用connection.commit()提交事务,否则修改不会生效,同时也能避免游标状态异常。

修改后的核心代码:

if result == 0:
    query = "UPDATE aos_products SET contact_id=NULL WHERE contact_id=1"
    cursor.execute(query)
    # 提交事务
    connection.commit()

    with open("ADILog.txt", "a") as f:
      f.write(f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')} Actions Performed: {action_count} Actions Left: {result - action_count} Finished Uploading\n")

    print("All Results Updated and Reset to process on next run")
    exit()

内容的提问来源于stack exchange,提问作者kuwam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:18:16