Seite 1 von 1

Wie Unterstriche '_' an mySQL übergeben?

Verfasst: Donnerstag 2. November 2006, 17:51
von thewulf00
Hallo!

Problem:
Ich versuche gerade, mit einem Python-Skript mit Hilfe des Moduls MySQLdb die Zugriffsrechte auf eine Datenbank zu ändern. Nun, das Ergebnis ist, dass er meint, es gäbe einen solchen GRANT nicht (sprich: der Name wird falsch übergeben).

Vorgehen:
Ich habe dieses Problem mit phpMyAdmin nachvollziehen können: Meine Datenbank enthält Unterstriche '_' im Namen, und phpMyAdmin "escaped" sie mit Backslashes '\'.
Bsp:

Code: Alles auswählen

REVOKE ALL PRIVILEGES ON `MY_DB`
wird zu

Code: Alles auswählen

REVOKE ALL PRIVILEGES ON `MY\_DB`
Genau das habe ich auch versucht. Das ging relativ einfach:

Code: Alles auswählen

dbname.replace('_', '\_')
Nun bedeutet aber der Backslash in dem String auch gleichzeitig für Python ein "escapen", so dass ich es dann so gemacht habe:

Code: Alles auswählen

dbname.replace('_', '\\_')
Aber es ist völlig egal, die Reaktion von mySQL ist jedes Mal die gleiche:

Code: Alles auswählen

You have an error [...] near '\\_DB' [...]
Also wird beim Entcodieren oder Umcodieren der Backslash irgendwo außerhalb meines Zugriffsbereichs nochmal escaped.

Fazit:
Ich habe jetzt absolut keine Möglichkeit, diese DB zu benutzen, den Namen ändern darf ich leider nicht.
Was habe ich für Möglichkeiten?

Verfasst: Donnerstag 2. November 2006, 18:09
von jens
Du nutzt IMHO das Escaping von der DB-API nicht, daran liegt es!

Du mußt es so machen:

Code: Alles auswählen

cursor.execute('REVOKE ALL PRIVILEGES ON `%s`', ("MY_DB",))
EDIT: siehe auch hier: [wiki]Parametrisierte SQL Queries[/wiki]

Verfasst: Freitag 3. November 2006, 10:33
von thewulf00
Nunja, ich machte es bisher so:

Code: Alles auswählen

query = "REVOKE ALL PRIVILEGES ON `%s`.*"%user[0] #user kommt aus einer anderen Query
c2.execute(query)
Ich habe es mal durch Deine Variante ersetzt:

Code: Alles auswählen

c2.execute("REVOKE ALL PRIVILEGES ON `%s`.*"%user[0])
Was genausowenig funktioniert. Selbes Ergebnis. Ich habe auch mal im Quellcode der MySQLdb ein print hinzugefügt, er macht es korrekt, bis auf das escapen der Unterstriche, das bleibt aus.

Ich habe es auch mal druch den Wert selbst ersetzt:

Code: Alles auswählen

c2.execute("REVOKE ALL PRIVILEGES ON `%s`.*"%"MY_DB")
Alles das selbe.

Verfasst: Freitag 3. November 2006, 10:59
von gerold
thewulf00 hat geschrieben:Ich habe es mal durch Deine Variante ersetzt:

Code: Alles auswählen

c2.execute("REVOKE ALL PRIVILEGES ON `%s`.*"%user[0])
Hi thewulf00!

Bitte sieh dir noch einmal ganz genau das an, was dir Jens geschrieben hat.

http://www.python-forum.de/post-48063.html#48063

Da kommt kein % zwischen dem Query-String und dem Parameter.

mfg
Gerold
:-)

Verfasst: Freitag 3. November 2006, 11:12
von jens
So:

Code: Alles auswählen

c2.execute("REVOKE ALL PRIVILEGES ON `%s`.*", (user[0],))

Verfasst: Freitag 3. November 2006, 12:41
von BlackJack
Mal 'ne ganz dumme Frage: Wieso den Unterstrich überhaupt escapen!? Der ist ein gültiges Zeichen in Bezeichnern.

Zweite dumme Frage: Kann es sein das die DB von Python aus gesehen in der ANSI-Betriebsart läuft und vielleicht über die Backticks stolpert? Das ist nämlich kein ANSI SQL; da werden doppelte Anführungszeichen stattdessen benutzt.

Verfasst: Freitag 3. November 2006, 13:40
von thewulf00
Ich habe mir ganz genau angesehen, was Jens postete.
Ich habe auch alle dort verzeichneten Verfahren ausprobiert, sie liefern alle das gleiche Ergebnis, außer qmark, der gibt einen Fehler aus.

Richtig, Unterstriche sind gültige Bezeichner, aber da phpMyAdmin in einem Datenbanknamen die Unterstriche escapt, und mysql die Anfrage ablehnt, schließe ich daraus, dass es in Datenbanken nicht ohne weiteres erlaubt ist.

Fazit:
Noch immer keine Lösung in Sicht.

Edit: Das hat sicher noch keiner probiert, oder? Ich meine, Rechte von Datenbanken zu ändern, deren Name einen oder mehrere Unterstriche hat. Ich erinnere mich nicht daran, dass dieses Problem jemals in Tabellennamen oder Spaltennamen auftauchte.

Verfasst: Freitag 3. November 2006, 13:49
von thewulf00
BlackJack hat geschrieben:Zweite dumme Frage: Kann es sein das die DB von Python aus gesehen in der ANSI-Betriebsart läuft und vielleicht über die Backticks stolpert? Das ist nämlich kein ANSI SQL; da werden doppelte Anführungszeichen stattdessen benutzt.
Ich habe jetzt alle Zeichen ausprobiert ( ` + ' + " ), er meldet außer bei Backticks überall Syntax Error.

Verfasst: Freitag 3. November 2006, 15:25
von BlackJack
Versuch's mal ohne Anführungsstriche, eigentlich braucht man die ja sowieso nur, wenn im Namen etwas "verbotenes" vorkommt. Und wie gesagt: Unterstriche sind in Bezeichnern erlaubt. So weit vom Standard kann selbst MySQL nicht weg sein. ;-)

Nächster Versuch sollte dann sein, diesen Befehl mit einer Tabelle auszuprobieren die keinen Unterstrich im Namen hat sondern nur aus Buchstaben besteht. Wenn es da auch nicht funktioniert, dann muss der Fehler wo anders liegen.

Und kannst Du mal ein minimales Quelltextbeispiel geben, bei dem das Problem auftaucht? Inklusive ungekürzter Fehlermeldungen bitte.