MySQL未读结果与Python

MySQL未读结果与Python,python,mysql,Python,Mysql,我使用mysql.connector执行SQL操作。 我有一个简短的脚本,它使用游标在游标上执行以下操作(字符串)。执行(…): 脚本在多个数据库db上迭代 问题是,在某个时候,我得到了一个“未读结果发现”错误。当我运行脚本时,似乎在某个时刻“use mydb”返回了一个结果(cursor.\u have\u result=True),而我没有预料到。奇怪的是,如果我重新运行完整的脚本,它会运行更长的时间,更多的数据库稍后会出现相同的错误 你能提出一个解决或调查这个问题的方法吗?我能做些什么来防

我使用mysql.connector执行SQL操作。 我有一个简短的脚本,它使用
游标在游标上执行以下操作(字符串)。执行(…)

脚本在多个数据库
db
上迭代

问题是,在某个时候,我得到了一个“未读结果发现”错误。当我运行脚本时,似乎在某个时刻“use mydb”返回了一个结果(cursor.\u have\u result=True),而我没有预料到。奇怪的是,如果我重新运行完整的脚本,它会运行更长的时间,更多的数据库稍后会出现相同的错误

你能提出一个解决或调查这个问题的方法吗?我能做些什么来防止“未读结果”


PS:当我重新运行脚本时,ALTER命令对已经完成的数据库失败。不确定这是否会导致问题。

使用MySQL Connector/Python,当您在不同位置使用connection对象而不读取结果时,可能会出现未读结果。这不是一件人们能做的事。您可以使用该命令立即读取结果

正如注释中提到的,最好分割语句并分别执行它们

如果要执行多条语句,则需要使用该方法(因为Connector/PythonV1.0.4)。实际上,如果您不使用multi选项并发送多条语句,InterfaceError将引发。(我也怀疑这里有一个bug。)

补充说明:

  • 您可以更改数据库,而不是执行USE命令
  • 最好将更改分组到一个ALTER TABLE语句中,如下所示:

    ALTER TABLE t1 DROP主键,首先添加id INT NOT NULL自动增量键,添加索引(c1)


您必须在光标中传递
buffered=true
。阅读更多官方文章


你能帮我转一下吗?不确定这是否与您收到“未读结果已找到”错误的原因相同。不确定是否存在相同的问题,但我发现,发出包含多个长时间运行的繁重查询的命令可能会导致类似于您的问题。尝试将您的
命令
拆分为三个单独的语句。@DJV:我已经拆分了这些命令,现在它运行时没有错误。谢谢不知道该如何解释。@Gerenuk I在包含数十万条目的表的alters和UPDATE中使用多个语句时遇到类似错误。也许是关于异步执行的?不太确定。如果没有
缓冲
选项,如何避免此错误?如果您使用MySQLCursor.description来读取结果,那么我应该使用另一种方法吗?@sorbet:唯一的方法是关闭连接并重新连接。不,获取描述时不会读取结果。为什么MySQL connector/python不能在不缓冲时丢弃未读结果?缓冲是一个巨大的性能问题,但是如果没有丢弃剩余数据的能力,关闭它是不可行的。我们的SQL没有这个问题。#geertjanvdk您能澄清一下在不同的地方使用连接而不“读取结果”是什么意思吗?我有一个类似的问题,但我不想像原来的海报那样一次发出多个命令。@zzzeek:如果只使用简单的查询,你不能简单地告诉MySQL服务器忘记结果。有一种方法可以绕过使用准备好的语句(我们的SQL就是这么做的)。如果您不希望得到结果,请尽可能选择较少。
"use {}".format(db)

"show tables"

command = """
ALTER TABLE Object DROP PRIMARY KEY;
ALTER TABLE Object ADD `id` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;
ALTER TABLE Object ADD INDEX (`uid`);"""
cursor = conn.cursor(buffered=True)