Wie Unterstriche '_' an mySQL übergeben?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
thewulf00
User
Beiträge: 11
Registriert: Donnerstag 2. November 2006, 17:39

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
thewulf00
User
Beiträge: 11
Registriert: Donnerstag 2. November 2006, 17:39

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So:

Code: Alles auswählen

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
thewulf00
User
Beiträge: 11
Registriert: Donnerstag 2. November 2006, 17:39

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.
thewulf00
User
Beiträge: 11
Registriert: Donnerstag 2. November 2006, 17:39

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