Seite 1 von 1

Zeichen escapen in MySQLdb

Verfasst: Donnerstag 28. Februar 2008, 15:20
von skl
Hallo,

ich habe eine Frage zur Verwendung des MySQLdb-Moduls. Ich würde gern dynamisch Werte in eine MySQL-Abfrage mit ".execute" einfügen.

tabelle = "Namen"
suchwort = "Heinz"

cursor.execute ("SELECT * FROM %s WHERE name LIKE %s", (tabelle, suchwort))

Wenn ich es so tue, wie angedeutet, werden sowohl "tabelle" als auch "suchwort" mit ' eingefasst, d.h. die erzeugte SQL-Abfrage lautet
"SELECT * FROM 'Namen' WHERE name LIKE 'Heinz'"

Diese Abfrage ist fehlerhaft, weil der Wert für FROM nicht in Hochkommata stehen darf. Weiss jemand eine Lösung für dieses Problem?

Die andere Sache wäre, dass ich immer ein % an den string "suchwort" anhängen will. Gibts einen Weg, dass in .execute zu machen oder sollte ich vorher den String ändern?

Viele Grüße,
Stephan

Verfasst: Donnerstag 28. Februar 2008, 16:27
von jens
Schau dir mal [wiki]Parametrisierte SQL-Queries[/wiki]an.

Verfasst: Donnerstag 28. Februar 2008, 16:42
von Leonidas
Tabellennamen einsetzen wird von der DB-API nicht vorgesehen. Sowas ist auch i.d.R. sinnlos, da das nur zusätzliche Sicherheitslücken öffnet. Wäre ja noch besser, wenn Web-User in beliebige Tabellen schreiben könnten.

Verfasst: Freitag 12. September 2008, 13:52
von Ravetracer
Gut, bei Tabellennamen ist's ja vielleich ok, aber was ist, wenn man dynamisch Spaltennamen einfügen möchte?
Das Ergebnis ist bei mir genau das gleiche.

Ich habe die Werte UND die Zielspaltennamen im Array(Tupel) und möchte die Updates so durchführen:

Code: Alles auswählen

sqvars = [(spaltenname, wert1, where1, where2),(...)]

cursor.executemany("UPDATE tabelle SET %s=%s WHERE spalte1=%s AND spalte2=%s",sqvars)
Kann man das irgendwie so hinbekommen, dass es doch möglich ist?

Verfasst: Freitag 12. September 2008, 16:13
von jens
Wie wäre das:

Code: Alles auswählen

sqvars = [(wert1, where1, where2),(...)]

sql = "UPDATE tabelle SET %s=%%s WHERE spalte1=%%s AND spalte2=%%s" % spaltenname

cursor.executemany(sql, sqvars)
Der spaltenname sollte natürlich aus eine sicheren Quelle kommen ;)