使用Python的MySQL未读结果

时间:2013-03-11 10:54:01

标签: python mysql

我使用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命令对已经完成的数据库失败。不确定是否会导致问题。

2 个答案:

答案 0 :(得分:12)

使用MySQL Connector / Python,当您在不同位置使用连接对象而不读取结果时,可能会发生未读结果。这不是一个可以绕过的东西。您可以使用buffered option立即阅读结果。

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

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

补充说明:

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

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

答案 1 :(得分:0)

您必须在光标中传递buffered = true。了解更多官方docs

cursor = conn.cursor(buffered=True)