Я пытаюсь создать среду Concurrence для Stackless Python. Он включает в себя драйвер MySQL и при запуске некоторого кода, который ранее выполнялся нормально с MySQLdb, он терпит неудачу.
Что я делаю:
Подключение к базе данных MySQL с помощью dbapi с именем пользователя/паролем/портом/базой данных.
Выполнение 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".
Наконец-то я нашел причину.
Драйвер просто повторил флаги возможностей сервера обратно в квитировании протокола, за исключением сжатия:
## 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
выполнило трюк.
Это определенно похоже на проблему с драйвером. Возможно, драйвер python не поддерживает префикс DB.
Чтобы быть уверенным, попробуйте наоборот: сначала use INFORMATION_SCHEMA
, а затем SELECT * FROM mydatabase.sometable