Seite 1 von 1
DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Montag 2. August 2010, 21:20
von noisefloor
Hallo,
wie die Übergabe von Parametern grundsätzlich funktioniert ist klar (MySQL):
Code: Alles auswählen
ersatz = 'egg'
c.execute("SELECT foo FROM bar WHERE spam LIKE %s", ersatz)
Jetzt will ich das aber mit einer "WHERE ... IN ..." Abfrage machen - und es klappt nicht...
Code: Alles auswählen
ersatz ='egg1, egg2'
c.execute("SELECT foo FROM bar WHERE spam IN %s", ersatz)
Egal wie ich Ersatz formatiere (wie oben, als Liste, "'egg1',egg2'" usw.) - Python wirft immer den SQL-Error "SQL-Syntax".
Ich vermute es liegt darin, die " bzw ' im bei der Parameter-Übergabe escaped werden...
Weiß jemand, wie man das macht?
Gruß, noisefloor
Re: DB API - Parameter übergeben bei "IN"
Verfasst: Dienstag 3. August 2010, 06:33
von noisefloor
Hallo,
Nachtrag: Wenn man es mit der "bösen"

String Ersetzung macht funktioniert es so:
Code: Alles auswählen
ersatz="egg1','egg2"
c.execute("SELECT foo FROM bar WHERE spam LIKE '%s' ") %ersatz)
Aber, wie gesagt, das auf die Parameter-Ersetzung zu transferieren kriege ich nicht hin...
Gruß, noisefloor
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Dienstag 3. August 2010, 08:24
von Hyperion
noisefloor hat geschrieben:
Egal wie ich Ersatz formatiere (wie oben, als Liste, "'egg1',egg2'" usw.) - Python wirft immer den SQL-Error "SQL-Syntax".
Also hast Du so was schon probiert? Wäre für mich jetzt das naheliegenste...
Code: Alles auswählen
ersatz = ('egg1', 'egg2')
c.execute("SELECT foo FROM bar WHERE spam IN %s", ersatz)
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Dienstag 3. August 2010, 09:45
von /me
noisefloor hat geschrieben:Code: Alles auswählen
ersatz ='egg1, egg2'
c.execute("SELECT foo FROM bar WHERE spam IN %s", ersatz)
Geht es auch dann nicht, wenn du die von der SQL-Syntax her erforderlichen runden Klammern verwendest?
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Dienstag 3. August 2010, 09:54
von noisefloor
Hallo,
ja, ich habe schon alle möglichen (abenteuerlichen) Kombis aus ' " und ( ) probiert.
Der Punkt ist: Die o.g. Version funktionieren in sofern, dass kein SQL-Fehler geworfen wird - aber das Ergebnis der Abfrage ist leer. Ist es aber in Wirklichkeit nicht. Heißt, wenn ich den SQL Query "von Hand" eingebe, also ohne Parameter-Ersetzung, gibt es ein Ergebnis (was auch richtig ist).
Sprich, irgendwie läuft da irgendwas schief bei der Parameterersetzung.
Weiß jemand, wie ob es da Möglichkeiten zum Debuggen gibt, also sowas wie den letzten Query anzeigen lassen (alles unter MySQL).
Gruß, noisefloor
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Dienstag 3. August 2010, 10:27
von BlackJack
@noisefloor: Die Parameterersetzung ersetzt einen *einzelnen* Platzhalter sicher mit einem *einzelnen* Wert. Man kann nicht einen Platzhalter durch mehrere Werte ersetzen, auch wenn der nach dem SQL-Test ``IN`` steht. Der Witz bei der sicheren Ersetzung ist ja gerade das Zeichen mit syntaktischer Bedeutung in SQL wie ',' oder ';' eben *nicht* zur SQL-Injektion verwendet werden können.
Vielleicht nicht so schön (und ungetestet):
Code: Alles auswählen
ersatz = ('egg1', 'egg2')
cursor.execute('SELECT foo'
' FROM bar'
' WHERE spam IN (%s)' % (','.join(['%s'] * len(ersatz))),
ersatz)
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Dienstag 3. August 2010, 11:10
von noisefloor
Hallo,
@BlackJack: jetzt wo du es so sagst - das macht ja auch Sinn. Immerhin lag ich mit meiner Vermutung richtig, dass der Query nicht funktioniert, weil was "weg-escaped" wird.
Die String-Ersetzung ist in diesem (meinem Fall) auch nicht soo kritisch, weil ich keine Nutzer-Eingabe durch reiche.
Gruß, noisefloor
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Dienstag 3. August 2010, 16:51
von Leonidas
noisefloor hat geschrieben:Die String-Ersetzung ist in diesem (meinem Fall) auch nicht soo kritisch, weil ich keine Nutzer-Eingabe durch reiche.
Dennoch, ich wuerde mir so einen Stil gar nicht erst angewoehnen.
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Mittwoch 4. August 2010, 06:29
von noisefloor
Hallo,
ja nee - ich nehme ja auch die Parameter wo es geht.
Im o.g. Fall geht es aber scheinbar nicht... Vielleicht sollte ich ein PEP für die Python DB API 3.0 einreichen...
Gruß, noisefloor
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Mittwoch 4. August 2010, 07:10
von BlackJack
@noisefloor: Von welchem Fall reden wir gerade? Ich habe in meinem Beispiel keine Zeichenkettenformatierung für die *Werte* verwendet.
Re: DB API - Parameter übergeben bei "WHERE ... IN"
Verfasst: Mittwoch 4. August 2010, 08:56
von noisefloor
Hallo,
@BlackJack: Yo, stimmt... Hatte das Beispiel zuerst falsch interpretiert

- jetzt habe ich es aber verstanden. Werde ich später mal probieren.
Gruß, noisefloor