我有两台 MySQL 服务器,一台古老的版本 5.7.17 和一台较新的 8.0.12。我的 python 脚本在连接到新数据库后执行没有任何问题,但在尝试在旧服务器上执行任何操作时抛出“未读结果找到”异常(它确实连接)。
这个问题与我见过的任何其他“发现未读结果”问题不同,因为设置
buffered=True
、buffered=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() # empty, buffered=True, buffered=False, anything, it doesn't change anything
print("B")
cursor.execute("SELECT * FROM some_table;")
print("C")
data = cursor.fetchall()
except mysql.connector.Error as err:
print("D")
print(err.msg)
在这种情况下,脚本将在
database.cursor()
打印出 A、D 并在控制台中显示错误消息时崩溃。我读过的所有其他问题都指向 fetchone 或 fetchall 方法,但是在我的代码中,这些方法甚至没有执行。
有问题的服务器上的 TLS 版本 TLSv1、TLSv1.1。良好服务器上的 TLS 版本 TLSv1、TLSv1.1、TLSv1.2。
MySQL 服务器是指 MySQL,而不是 MariaDB。
我没有做什么:从 mysql.connector 迁移到其他 MySQL python 库 - 这将需要重写整个应用程序,而我没有时间这样做。
按要求追溯:
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 源代码时,我发现在某些情况下可能需要
consume_results=True
,这最终解决了我的问题!
由于未知原因,拉取结果需要一些时间,但它确实有效。