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:

  1. Connexion à la base de données MySQL avec dbapi avec nom d'utilisateur / mot de passe / port / base de données.

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top