12

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

"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`);"""

该脚本遍历多个数据库db

问题是在某些时候我收到“未读结果”错误。似乎当我运行脚本时,在某些时候“使用 mydb”会返回一个结果(cursor._have_result=True),而我没想到会这样。奇怪的是,如果我重新运行完整的脚本,它会运行更长的时间,更多的数据库稍后会给出相同的错误。

您能提出解决或调查此问题的方法吗?我可以做些什么来防止“未读结果”吗?

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

4

2 回答 2

16

使用 MySQL Connector/Python,当你在不同的地方使用连接对象而不读取结果时,可能会出现Unread结果。这不是一个可以绕过的东西。您可以使用缓冲选项立即读取结果。

正如评论中提到的,最好将语句拆分并单独执行。

如果要执行多个语句,则需要对MySQLCursor.execute()方法使用multi=True选项(从 Connector/Python v1.0.4 开始)。实际上,如果您不使用multi选项并发送多个语句,则会引发 InterfaceError。(我也怀疑这里有一个错误..)

补充说明:

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

    ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT NOT NULL AUTO_INCREMENT KEY FIRST, ADD INDEX(c1)

于 2013-06-24T05:09:35.687 回答
3

你必须通过buffered = true你的光标。阅读更多官方文档

cursor = conn.cursor(buffered=True)
于 2020-02-23T11:02:44.557 回答