meneliel hat geschrieben:Alles was gehen soll, ist, das Teile des Where-Teiles formuliert werden sollen. Und das versuche ich so mininal wie möglich zu halten. Hab ich bei dem 2. Teil halt auch geschafft.
Minimal scheint mir das nicht.
Ich will nur Indikatoren berechnen*, aus einer passenden Tabelle, wo die alle drin stehen, aber halt nicht alle auf einmal, sondern ich möchte das beschränken auf Kategorien - und da gibt es nicht nur eine, sondern 2 pro Indikator. Das kann am Ende recht viel werden. Also nicht nur KAT1 ="a" sondern vielleicht Kat 1 ="a" and (Kat2 ="A" OR Kat2 ="C"). Könnte aber auch sein, dass ich nru einen einzigen Indikator direkt selektiere über seine ID ... und das macht es irgenwie gerade etwas kompliziert ...
nicht unbedingt.
in mysql kann man statt
einfach
schreiben, und das kann man auch mit dem escaping nutzen:
Code: Alles auswählen
query = "select * from tabelle where kat1 in %s and kat2 in %s"
values = (["A"], ["A", "C"])
cursor.execute(query, values)
Funktioniert ja nun auch mit den Templates ganz gut Smile ... eigentlich ... wenn man brav ist und/oder weiß was man tut
also funktioniert es NICHT. Es bricht lediglich nicht sofort zusammen.
Bitte nicht falsch verstehen, das geht nicht gegen dich persönlich. Nur ist es einfach dumm, den komplizierten unsicheren weg, anstatt den einfachen, sicheren Weg zu gehen.
*etwas hilflos guck* ... oh je oh je ... Ich versteh das mit dem escapen und quoten grade überhaupt nicht.... also so überhaupt nicht, dass ich gar nicht weiß was Ihr eigentlich meint und wie mir das jetzt weiterhelfen soll ... Embarassed *schäm*
Escaping ist (ohne sql drumrum, plain python) z.B. sowas:
die ' um welt werden mittels der \ "escaped", weil sonst python denkt, dass du einen string namens 'hallo ' hast, und danach wieder python kommt.
Bei sql hast du bei der "manuellen" ersetzung eben das Problmen, dass der user ' eingeben kann, und sql dann einen Teil seiner eingabe als befehl sieht.
Denke dir einen sql-string, der so aussieht:
Code: Alles auswählen
query = "select id from users where name='%s' and password='%s'"
und nun, wie er nach der ersetzung aussieht, wenn folgendes gilt
Code: Alles auswählen
query %= ("egal' or 1=1 --", "völlig egal")
print query # select id from users where name = 'egal' or 1=1 --'and password='völlig egal'
schwupps, hast du eine sicherheitslücke, über die sich jeder einloggen kann.
Auch, wenn man davon ausgehen könnte, dass alle user gutartig wären, müsste man sich drum kümmern, denn sonst kommt früher oder später ein user namens O'Hara daher, und macht völlig gutartigerweise eine Eingabe, die das Programm abschmieren lässt.
Aber, weil das Problem so häufig ist, hat unsere db-api da schon was vorbereitet, nämlich den zweiten Parameter der execute-Methode.
Wenn du
Code: Alles auswählen
c.execute("insert into users set name = %s", ["O'Hara"])
schreibst, kümmert sich execute darum, dass aus O'Hara O\'Hara wird, und du musst dir keine Sorgen mehr machen.