1. ホーム
  2. パイソン

python Commands out of sync; you can't run this command now.

2022-02-21 19:35:30

MySQL-pythonです。コマンドの同期がとれていない

3月13日 TH , 2012

MySQLデータベースアクセスレイヤーに新しい機能を追加する際に、このエラーに遭遇しました。

<テーブル
1


ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

Commands out of sync

以前にも散発的に見かけたことがありますが、あまりに頻度が少ないので、あまり気にしていませんでしたが、今回、原因を探ったところ、MySQLのドキュメントにある  mysql_use_result()  エラーの内容は以下の通りです。

Commands out of sync; you can't run this command now in your client code」と表示された場合、クライアント関数の呼び出し順序が誤っています。

例えば、mysql_use_result() を使用していて、 mysql_free_result() をコールする前に新しいクエリを実行しようとすると、 このようなことが起こる可能性があります。また、データを返す 2 つのクエリを実行する際に mysql_use_result() や mysql_store_result() を呼び出さない場合にも起こる可能性があります。

<スパン コマンドの同期がとれていない dev.mysql.com/doc/refman/5.1/en/...

MySQL とクライアントは、半二重応答プロトコルを使用して通信し、クライアントが送信したクエリごとに、サーバはその結果をクライアントに強制的にプッシュし、クライアントは以下を実行する必要があります。  mysql_store_result()  または  Commands out of sync  サーバーサイドから結果をフェッチすることは、完全なクエリ操作です。結果をフェッチせずにクエリを送信すると  mysql_free_result() .

MySQL-pythonを使用しているため、最初のケースでは  mysql_store_result()  が存在する可能性は低く、MySQLdb のデフォルトカーソルでは  mysql_use_result()  の代わりに  1 SELECT a, b FROM t LIMIT 1; -- some comments ということで、2番目のケースになるはずです。

この問題を引き起こす可能性のあるクエリをいくつか這い回ったところ、次のような文が見つかりました。

<テーブル
Commands out of sync

mysql_store_result()

このようなクエリを実行した後、さらにクエリを実行すると、次のような問題が発生します。  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn, BaseCursor): """This is the standard Cursor class that returns rows as tuples and stores the result set in the client.""" class DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn, BaseCursor): """This is a Cursor class that returns rows as dictionaries and stores the result set in the client.""" class SSCursor(CursorUseResultMixIn, CursorTupleRowsMixIn, BaseCursor): """This is a Cursor class that returns rows as tuples and stores the result set in the server.""" class SSDictCursor(CursorUseResultMixIn, CursorDictRowsMixIn, BaseCursor): """This is a Cursor class that returns rows as dictionaries and stores the result set in the server."""  の問題が発生します。

これらは実際にはセミコロンで区切られた2つの別々のクエリ文であるため、MySQLdb を使用して実行すると、1つの文として MySQL サーバに送信され、その後 MySQLdb はこれらを一度実行します。  Cursor .

以前は、各クエリに自動的にコメントを追加する必要があり、末尾にセミコロンを持つ個々のクエリは、コメントを追加した後にこの問題を引き起こしました。したがって、コメントを追加する前にセミコロンを取り除くだけでよいのです。

MySQLdbには4種類のカーソルがあります。

<テーブル
mysql_store_result()

SSCursor

デフォルトでは  mysql_use_result() は、クエリが送信された後に実行される  mysql_store_result() は、MySQL サーバから返されたすべてのデータをフェッチし、ローカルにキャッシュします。 Cursor  が使用します。  mysql_use_result() を使用して、サーバ側で結果をキャッシュし、クライアント側で行ごとに結果を取得します。  mysql_store_result()  を使用すると、クライアント側のメモリを節約できますが、並行処理が多い環境では、デフォルトの  Cursor  なぜなら、MySQL サーバはクライアントがすべての結果をフェッチした後に関連するロックを解放するだけであり、行ごとにフェッチして各行を個別に処理すると、ほとんどの場合時間がかかるからです。

一度にすべての文を実行したかったので、SQL文を連結するために;を使用したため、エラーが発生し、最終的な解決策は、各sqlを別々に実行することでした。

元記事へのリンク