0

我正在尝试 Stackless Python 的并发框架。它包括一个 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”查询。

4

2 回答 2

1

它绝对看起来像一个驱动程序问题。也许 python 驱动程序不支持 DB 前缀。

只是为了确定,尝试相反的方式:先use INFORMATION_SCHEMA,然后SELECT * FROM mydatabase.sometable

于 2009-11-29T02:32:15.983 回答
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 回答