problemas de driver do MySQL com INFORMATION_SCHEMA?
-
06-07-2019 - |
Pergunta
Eu estou tentando o quadro Concurrence para Stackless Python. Ele inclui um driver MySQL e ao executar um código que anteriormente funcionou muito bem com MySQLdb ele falhar.
O que eu estou fazendo:
-
Como conectar ao banco de dados MySQL usando dbapi com nome de usuário / senha / port / banco de dados.
-
A execução
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
Esta falha com mensagem:
Table 'mydatabase.columns' doesn't exist
"mydatabase" é o banco de dados I especificado na etapa 1.
Ao fazer a mesma consulta no console MySQL após a emissão "mydatabase USE", ele funciona perfeitamente.
Verificar a comunicação de rede produz algo como isto:
>>>myusername
>>>scrambled password
>>>mydatabase
>>>CMD 3 SET AUTOCOMMIT = 0
<<<0
>>>CMD 3 SELECT * FROM INFORMATION_SCHEMA.COLUMNS
<<<255
<<<Table 'mydatabase.columns' doesn't exist
É este um problema de driver (uma vez que funciona em MySQLdb)? Ou que não estou suposto ser capaz de consulta INFORMATION_SCHEMA desta maneira?
Se eu enviar um específico "USE INFORMATION_SCHEMA" antes de tentar consultá-lo, eu recebo o resultado esperado. Mas, eu não quero ter que regar meu código todo com consultas "utilização".
Solução 2
Eu finalmente encontrei a razão.
O condutor apenas ecoou a capacidade do servidor bandeiras trás no aperto de mão protocolo, com a exceção de compressão:
## concurrence/database/mysql/client.py ##
client_caps = server_caps
#always turn off compression
client_caps &= ~CAPS.COMPRESS
Como o servidor tem a capacidade ...
CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */
... que foi ecoado de volta ao servidor, dizendo-lhe para não permitir que a sintaxe.
Adicionando client_caps &= ~CAPS.NO_SCHEMA
fez o truque.
Outras dicas
Ele definitivamente parece um problema de driver. Talvez o motorista python não suportam o prefixo DB.
Só para ter certeza, tente o contrário: primeiro use INFORMATION_SCHEMA
e depois SELECT * FROM mydatabase.sometable