Zeichen escapen in MySQLdb

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
skl
User
Beiträge: 1
Registriert: Donnerstag 28. Februar 2008, 15:07

Donnerstag 28. Februar 2008, 15:20

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
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 28. Februar 2008, 16:27

Schau dir mal [wiki]Parametrisierte SQL-Queries[/wiki]an.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 28. Februar 2008, 16:42

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Ravetracer
User
Beiträge: 7
Registriert: Montag 10. Dezember 2007, 14:50

Freitag 12. September 2008, 13:52

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

Freitag 12. September 2008, 16:13

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 ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten