【问题标题】:MySQL driver issues with INFORMATION_SCHEMA?INFORMATION_SCHEMA 的 MySQL 驱动程序问题?
【发布时间】:2010-12-21 07:51:29
【问题描述】:

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

我在做什么:

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

  2. 正在执行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”查询。

【问题讨论】:

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


    【解决方案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 &amp;= ~CAPS.NO_SCHEMA 就可以了。

    【讨论】:

      【解决方案2】:

      这看起来肯定是驱动程序问题。可能python驱动不支持DB前缀。

      为了确定起见,请尝试相反的方法:首先是use INFORMATION_SCHEMA,然后是SELECT * FROM mydatabase.sometable

      【讨论】:

      • 谢谢,换一种方式尝试产生同样的错误,告诉我它与 INFORMATION_SCHEMA 没有任何关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2011-03-12
      • 2021-05-14
      • 2012-04-02
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多