0

StacklessPythonのConcurrenceフレームワークを試しています。これにはMySQLドライバーが含まれており、以前はMySQLdbで正常に実行されていたコードを実行すると、失敗します。

私がしていること:

  1. ユーザー名/パスワード/ポート/データベースでdbapiを使用してMySQLデータベースに接続します。

  2. 実行中SELECT * FROM INFORMATION_SCHEMA.COLUMNS

これは次のメッセージで失敗します:

Table 'mydatabase.columns' doesn't exist

「mydatabase」は、手順1で指定したデータベースです。

「USEmydatabase」を発行した後に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を照会できないようにする必要がありますか?

クエリを実行する前に特定の「USEINFORMATION_SCHEMA」を送信すると、期待どおりの結果が得られます。ただし、コード全体に「USE」クエリを振りかける必要はありません。

4

2 に答える 2

1

私はついにその理由を見つけました。

ドライバーは、圧縮を除いて、プロトコルハンドシェイクでサーバー機能フラグをエコーバックしました。

## concurrence/database/mysql/client.py ##

client_caps = server_caps 

#always turn off compression
client_caps &= ~CAPS.COMPRESS

サーバーには機能があるので...

CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */

...それはサーバーにエコーバックされ、その構文を許可しないように指示しました。

追加するclient_caps &= ~CAPS.NO_SCHEMAことでうまくいきました。

于 2009-11-29T23:42:21.117 に答える
1

それは間違いなくドライバーの問題のようです。python ドライバーが DB プレフィックスをサポートしていない可能性があります。

念のために、逆の方法を試してくださいuse INFORMATION_SCHEMASELECT * FROM mydatabase.sometable

于 2009-11-29T02:32:15.983 に答える