我正在尝试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”查询。
答案 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
就可以了。