MySQL-Treiber Probleme mit INFORMATION_SCHEMA?
-
06-07-2019 - |
Frage
Ich versuche, die Gleichzeitigkeit Rahmen für Stackless Python aus. Es enthält einen MySQL-Treiber und wenn einige Code ausgeführt wird, der zuvor mit MySQLdb fein lief es nicht.
Was ich tue:
-
Verbinden mit der MySQL-Datenbank mit dbapi mit Benutzername / Passwort / Hafen / Datenbank.
-
Ausführen
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
Dies scheitert mit der Meldung:
Table 'mydatabase.columns' doesn't exist
"mydatabase" ist die Datenbank, die ich in Schritt 1 angegeben.
Wenn die gleiche Abfrage in der Konsole MySQL zu tun, nachdem "USE mydatabase" Ausgabe, es funktioniert perfekt.
Überprüfen der Netzwerkkommunikation Ausbeuten etwas wie folgt aus:
>>>myusername
>>>scrambled password
>>>mydatabase
>>>CMD 3 SET AUTOCOMMIT = 0
<<<0
>>>CMD 3 SELECT * FROM INFORMATION_SCHEMA.COLUMNS
<<<255
<<<Table 'mydatabase.columns' doesn't exist
Ist das ein Treiber-Problem (da es in MySQLdb funktioniert)? Oder bin ich nicht in der Lage sein soll INFORMATION_SCHEMA auf diese Weise abfragen?
Wenn ich einen bestimmten „USE INFORMATION_SCHEMA“ senden, bevor Sie versuchen, es zu fragen, erhalte ich das erwartete Ergebnis. Aber ich will nicht zu haben, meinen Code über und über mit „USE“ Abfragen streuen.
Lösung 2
Schließlich fand ich den Grund.
Der Fahrer hallte nur die Server-Funktion Flags zurück in dem Protokoll Handshake, mit Ausnahme der Kompression:
## concurrence/database/mysql/client.py ##
client_caps = server_caps
#always turn off compression
client_caps &= ~CAPS.COMPRESS
Da der Server die Fähigkeit hat, ...
CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */
... das war wieder auf den Server wider, es nicht zu sagen, dass die Syntax zu ermöglichen.
Hinzufügen client_caps &= ~CAPS.NO_SCHEMA
den Trick hat.
Andere Tipps
Es sieht definitiv wie ein Treiber-Problem. Vielleicht Fahrer die Python nicht die DB-Präfix unterstützen.
Nur um sicherzugehen, versuchen, die umgekehrt: zuerst use INFORMATION_SCHEMA
und dann SELECT * FROM mydatabase.sometable