Проблемы с драйвером MySQL с INFORMATION_SCHEMA?

Я пробую среду Concurrence для Stackless Python. Он включает в себя драйвер MySQL, и при запуске некоторого кода, который ранее нормально работал с MySQLdb, происходит сбой.

Что я делаю:

  1. Подключение к базе данных MySQL с использованием dbapi с именем пользователя/паролем/портом/базой данных.

  2. Выполнение SELECT * FROM INFORMATION_SCHEMA.COLUMNS

Это не удается с сообщением:

Table 'mydatabase.columns' doesn't exist

«mydatabase» — это база данных, которую я указал на шаге 1.

При выполнении того же запроса в консоли MySQL после выдачи «USE mydatabase» он работает отлично.

Проверка сетевого соединения дает что-то вроде этого:

>>>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».


person truppo    schedule 29.11.2009    source источник


Ответы (2)


Это определенно похоже на проблему с драйверами. Возможно, драйвер Python не поддерживает префикс DB.

На всякий случай попробуйте наоборот: сначала use INFORMATION_SCHEMA, а затем SELECT * FROM mydatabase.sometable

person Jorge Bernal    schedule 29.11.2009
comment
Спасибо, попытка наоборот привела к той же ошибке, говоря мне, что это не имеет ничего общего с INFORMATION_SCHEMA конкретно. - person truppo; 30.11.2009

Я наконец нашел причину.

Драйвер просто повторил флаги возможностей сервера в рукопожатии протокола, за исключением сжатия:

## 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 помогло.

person truppo    schedule 29.11.2009