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
相关产品推荐
相关产品推荐

