python Commands out of sync; you can't run this command now.
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を別々に実行することでした。
関連
-
Pythonです。pandasのiloc, loc, ixの違いと連携について
-
python socket.error: [Errno 9] 不正なファイルディスクリプタに対する解決策
-
pythonBug:AttributeError: タイプオブジェクト 'datetime.datetime' は属性 'datetime' を持たない。
-
python3 failed to start Fatal Python error: initfsencoding: unable to load file system codec
-
ImportError: torchvision という名前のモジュールがありません。
-
ImportError: pandas という名前のモジュールがない 問題が解決される
-
Logistics Regressionにおけるcoef_とintercept_の具体的な意味についてsklearnで解説します。
-
Python による pyserial 経由でのシリアルポートの読み取りと書き込み
-
Python で実行 TypeError: + でサポートされていないオペランド型: 'float' および 'str'.
-
エンコード問題:UnicodeDecodeError: 'utf-8' コーデックは、位置のバイト 0xb3 をデコードできません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ユニコード・オブジェクトは、ハッシュ・エラーの解決前にエンコードする必要があります。
-
Python_matplotlib の凡例は外側に保存すると不完全になる
-
concat を使用して 2 つのデータフレームを結合する際のエラー
-
ERROR: 要件ファイルを開くことができませんでした。[Errno 2] そのようなファイルまたはディレクトリがありません: 'requirements.txt'.
-
Solve ImportError: cannot import name 'np_utils' from 'tensorflow.keras.utils'
-
AttributeError: モジュール 'pip' には 'main' という属性がありません。
-
Pythonで問題解決。TypeError: 'encoding' is an invalid keyword argument for this function.
-
TypeError: 'float' オブジェクトが for ループ内で整数として解釈できない どうすればよいですか?
-
Pythonの非パッケージ問題で相対インポートを試みる
-
[Python] ValueError: サポートされていない pickle プロトコルです。5 解決方法