我使用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命令对已经完成的数据库失败。不确定是否会导致问题。
答案 0 :(得分:12)
使用MySQL Connector / Python,当您在不同位置使用连接对象而不读取结果时,可能会发生未读结果。这不是一个可以绕过的东西。您可以使用buffered option立即阅读结果。
正如评论中所提到的,最好将语句拆分并分别执行。
如果要执行多个语句,则需要使用multi=True option for the MySQLCursor.execute()方法(自Connector / Python v1.0.4起)。实际上,如果您不使用 multi 选项并发送多个语句,则会引发InterfaceError。 (我确实怀疑这里有一个错误..)
补充说明:
您最好将更改分组到一个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)