有关INFORMATION_SCHEMA的MySQL驱动程序问题?

时间:2009-11-29 02:06:11

标签: python mysql python-stackless python-db-api

我正在尝试Stackless Python的Concurrence框架。它包含一个MySQL驱动程序,当运行一些以前用MySQLdb运行良好的代码时,它会失败。

我在做什么:

  1. 使用带有用户名/密码/端口/数据库的dbapi连接到MySQL数据库。

  2. 执行SELECT * FROM INFORMATION_SCHEMA.COLUMNS

  3. 此操作失败并显示消息:

    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 个答案:

答案 0 :(得分:1)

这绝对看起来像是一个驱动程序问题。也许python驱动程序不支持数据库前缀。

为了确定,请尝试相反:首先use INFORMATION_SCHEMA然后SELECT * FROM mydatabase.sometable

答案 1 :(得分: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就可以了。