我正在尝试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

我终于找到了原因。

驱动程序只是在协议握手中回显服务器功能标志,但压缩除外:

## 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驱动程序不支持数据库前缀。

可以肯定的是,尝试相反的方法:首先使用INFORMATION_SCHEMA 然后 SELECT * FROM mydatabase.sometable

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top