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

問題は、ある時点で「未読の結果が見つかりました」というエラーが表示されることです。スクリプトを実行すると、ある時点で「use mydb」が結果 (curs._have_result=True) を返しますが、予期していなかったようです。奇妙なことに、完全なスクリプトを再実行すると、後で同じエラーが発生するデータベースが増えるため、少し長く実行されます。

この問題を解決または調査する方法を提案できますか? 「未読結果」を防ぐためにできることはありますか?

PS: スクリプトを再実行すると、既に実行されているデータベースに対して ALTER コマンドが失敗します。それが問題を引き起こすかどうかはわかりません。

4

2 に答える 2

16

MySQL Connector/Pythonを使用して、結果を読み取らずに別の場所で接続オブジェクトを使用すると、見つかった未読の結果が発生する場合があります。それは人が回れるものではありません。bufferedオプションを使用して、結果をすぐに読み取ることができます。

コメントで述べたように、ステートメントを分割して個別に実行することをお勧めします。

複数のステートメントを実行する場合は、MySQLCursor.execute() メソッドにmulti=Trueオプションを使用する必要があります(Connector/Python v1.0.4 以降)。実際には、multiオプションを使用せずに複数のステートメントを送信すると、InterfaceError が発生します。(ここでもバグを疑っています..)

補足事項:

  • USE コマンドを実行してデータベースを変更する代わりに、MySQLConnection.database プロパティを変更できます。
  • 次のように、変更を 1 つの 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 に答える