INFORMATION_SCHEMAでのMySQLドライバーの問題?
-
06-07-2019 - |
質問
Stackless PythonのConcurrenceフレームワークを試しています。 MySQLドライバーが含まれており、以前にMySQLdbで正常に実行されていたコードを実行すると、失敗します。
私がしていること:
-
ユーザー名/パスワード/ポート/データベースでdbapiを使用してMySQLデータベースに接続します。
-
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
の実行
これはメッセージで失敗します:
Table 'mydatabase.columns' doesn't exist
" mydatabase"は、ステップ1で指定したデータベースです。
「USE mydatabase」を発行した後にMySQLコンソールで同じクエリを実行すると、完全に機能します。
ネットワーク通信を確認すると、次のような結果が得られます。
>>>myusername
>>>scrambled password
>>>mydatabase
>>>CMD 3 SET AUTOCOMMIT = 0
<<<0
>>>CMD 3 SELECT * FROM INFORMATION_SCHEMA.COLUMNS
<<<255
<<<Table 'mydatabase.columns' doesn't exist
これはドライバーの問題ですか(MySQLdbで動作するため)?または、このようにINFORMATION_SCHEMAをクエリできないはずですか?
特定の「USE INFORMATION_SCHEMA」を送信した場合クエリを実行する前に、期待どおりの結果が得られます。しかし、「USE」を使用してコードを散らばる必要はありません。クエリ。
解決 2
やっと理由がわかりました。
ドライバーは、圧縮を除き、プロトコルハンドシェイクでサーバー機能フラグをエコーバックしました。
## concurrence/database/mysql/client.py ##
client_caps = server_caps
#always turn off compression
client_caps &= ~CAPS.COMPRESS
サーバーに機能があるため...
CLIENT_NO_SCHEMA 16 / * database.table.columnを許可しない* /
...サーバーにエコーバックされ、その構文を許可しないように指示されました。
client_caps&amp; =〜CAPS.NO_SCHEMA
を追加するとうまくいきました。
他のヒント
間違いなくドライバーの問題のように見えます。たぶん、PythonドライバーはDBプレフィックスをサポートしていません。
確かに、他の方法を試してください:最初に INFORMATION_SCHEMA
を使用し、次に SELECT * FROM mydatabase.sometable