使用Python的MySQL未读结果

Ger*_*nuk 10 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`);"""
Run Code Online (Sandbox Code Playgroud)

该脚本遍历多个数据库db.

问题是,在某些时候我收到"未读结果"错误.看来,当我运行脚本时,"使用mydb"会返回一个结果(cursor._have_result = True),当时我没想到.奇怪的是,如果我重新运行完整的脚本,它会运行一段时间,更多的数据库会在以后发出相同的错误.

你能建议一种解决或调查这个问题的方法吗?我能做些什么来防止"未读结果"?

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

gee*_*vdk 12

使用MySQL连接器/ Python中,发现未读的结果,当您使用在不同的地方连接对象而不读取结果可能发生.这不是一个可以绕过的东西.您可以使用buffered选项立即读取结果.

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

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

补充说明:

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

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


小智 5

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

cursor = conn.cursor(buffered=True)
Run Code Online (Sandbox Code Playgroud)