使用mysql.connector连接MySQL 5.7.17创建游标报'Unread result found'
问题:连接MySQL 5.7.17时调用cursor()抛出'Unread result found'异常
环境与现象
- 两台MySQL服务器:旧版本5.7.17(仅支持TLSv1、TLSv1.1),新版本8.0.12(支持TLSv1、TLSv1.1、TLSv1.2)
- Python脚本连接新版本数据库操作正常,但连接旧版本后,调用
database.cursor()时直接抛出Unread result found异常,报错阶段早于fetchone/fetchall执行 - 尝试设置
cursor(buffered=True/False)参数均无法解决问题
示例代码
try: database = mysql.connector.connect( user="...", password="...", database="...", host="...", port=3306, autocommit=True ) except mysql.connection.Error as err: print(err.msg) exit(1) try: print("A") cursor = database.cursor() # 无论设置buffered参数都无效 print("B") cursor.execute("SELECT * FROM some_table;") print("C") data = cursor.fetchall() except mysql.connector.Error as err: print("D") print(err.msg)
控制台仅输出A、D及错误信息,代码未执行到cursor.execute阶段。
回溯信息
Traceback (most recent call last): File "/mnt/c/Users/{removed}/Desktop/{removed}/{removed}/./dumpToFile", line 155, in <module> row_count = cm.{removed function name}(attribute, single_day, mdb, sdb) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/mnt/c/Users/{removed}/Desktop/{removed}/{removed}/conv_methods.py", line 298, in {removed function name} mysql_cursor = mdb.cursor(buffered=True) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/mysql/connector/connection.py", line 868, in cursor self.handle_unread_result() File "/usr/lib/python3/dist-packages/mysql/connector/connection.py", line 1132, in handle_unread_result raise errors.InternalError("Unread result found") mysql.connector.errors.InternalError: Unread result found
限制条件
暂不考虑更换mysql.connector库,避免重写整个应用。
解决方案
1. 清理连接中遗留的未读结果
异常触发在cursor()方法,说明当前数据库连接中存在未读取的结果集(可能是之前复用连接时的操作遗留)。在创建新游标前手动清理:
# 在调用cursor()前添加这段代码 if database.unread_result: dummy_cursor = super(type(database), database).cursor() dummy_cursor.fetchall() dummy_cursor.close()
2. 重置连接会话状态
如果存在连接复用的情况,创建新游标前显式重置会话,清除之前的操作残留:
database.reset_session() cursor = database.cursor(buffered=True)
同时确保每次使用游标后关闭:
# 操作完成后关闭游标 cursor.close()
3. 适配旧服务器TLS版本
旧服务器仅支持低版本TLS,可在连接时指定兼容的TLS版本和加密套件:
database = mysql.connector.connect( user="...", password="...", database="...", host="...", port=3306, autocommit=True, ssl_cipher='DEFAULT@SECLEVEL=1', tls_versions=['TLSv1', 'TLSv1.1'] )
4. 降级mysql.connector版本
若上述方法无效,尝试降级驱动到与MySQL 5.7.17更兼容的版本(比如8.0.20之前的版本),新版本驱动对旧MySQL服务器的兼容性处理可能存在变化。
内容的提问来源于stack exchange,提问作者KMadura
相关产品推荐
相关产品推荐

