Problèmes de pilote MySQL avec INFORMATION_SCHEMA?
-
06-07-2019 - |
Question
J'essaie le framework Concurrence pour Stackless Python. Il inclut un pilote MySQL et lorsqu’il exécute un code qui fonctionnait auparavant correctement avec MySQLdb, il échoue.
Ce que je fais:
-
Connexion à la base de données MySQL avec dbapi avec nom d'utilisateur / mot de passe / port / base de données.
-
Exécution de
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
Cela échoue avec le message suivant:
Table 'mydatabase.columns' doesn't exist
" mydatabase " est la base de données que j'ai spécifiée à l'étape 1.
Lorsque vous effectuez la même requête dans la console MySQL après avoir émis "USE mydatabase", cela fonctionne parfaitement.
En vérifiant la communication réseau, vous obtenez quelque chose comme ceci:
>>>myusername
>>>scrambled password
>>>mydatabase
>>>CMD 3 SET AUTOCOMMIT = 0
<<<0
>>>CMD 3 SELECT * FROM INFORMATION_SCHEMA.COLUMNS
<<<255
<<<Table 'mydatabase.columns' doesn't exist
S'agit-il d'un problème de pilote (puisqu'il fonctionne dans MySQLdb)? Ou est-ce que je ne suis pas censé pouvoir interroger INFORMATION_SCHEMA de cette façon?
Si j'envoie un message "USE INFORMATION_SCHEMA" spécifique avant d'essayer de l'interroger, j'obtiens le résultat attendu. Mais je ne veux pas avoir à saupoudrer mon code de partout avec "USE". requêtes.
La solution 2
J'ai finalement trouvé la raison.
Le pilote vient de rappeler les indicateurs de capacité du serveur lors de la négociation du protocole, à l'exception de la compression:
## concurrence/database/mysql/client.py ##
client_caps = server_caps
#always turn off compression
client_caps &= ~CAPS.COMPRESS
Comme le serveur a la capacité ...
CLIENT_NO_SCHEMA 16 / * Ne pas autoriser database.table.column * /
... qui a été renvoyé au serveur en lui disant de ne pas autoriser cette syntaxe.
L'ajout de client_caps & amp; = ~ CAPS.NO_SCHEMA
a fait l'affaire.
Autres conseils
Cela ressemble vraiment à un problème de conducteur. Peut-être que le pilote python ne supporte pas le préfixe DB.
Pour être sûr, essayez l’inverse: d’abord utilisez INFORMATION_SCHEMA
, puis SELECT * FROM mydatabase.sometable