Übergabe des Parameters an DB.execute für die WHERE IN ... INT-Liste

8

Mit der Python-DB-API-Spezifikation können Sie Parameter der execute () -Methode übergeben. Teil meiner Aussage ist eine WHERE IN-Klausel und ich habe ein Tupel verwendet, um das IN zu füllen. Zum Beispiel:

%Vor%

Wenn ich jedoch in eine Situation komme, in der das Parameter-Tupel nur ein Tupel von 1 Element ist, schlägt die Ausführung fehl.

  

ProgrammingError: FEHLER: Syntaxfehler bei oder nahe ")"
  Zeile 13: WHERE ID IN (3,)

Wie kann ich das Tupel richtig mit Klausel arbeiten?

    
John Giotta 12.02.2010, 16:50
quelle

4 Antworten

8

Bearbeiten: Bitte machen Sie, wie @rspeer in einem Kommentar erwähnt, Vorkehrungen, um sich vor SQL-Injection-Angriffen zu schützen.

Testen mit pg8000 (eine DB-API 2.0-kompatible Pure-Python-Schnittstelle zur PostgreSQL-Datenbank-Engine):

Dies ist die empfohlene Methode, um mehrere Parameter an eine "IN" -Klausel zu übergeben.

%Vor%

Eine weitere Bearbeitung (vollständig getestet und funktionierendes Beispiel):

%Vor%     
bernie 12.02.2010, 17:48
quelle
1

Der Fehler kommt vom Komma nach dem 3. Komm einfach auf die einzelnen Werte und du bist fertig.

%Vor%     
Daniel 12.02.2010 16:58
quelle
1

Dies ist möglicherweise keine Antwort auf genau die Frage, die Sie gestellt haben, aber ich denke, dass es das Problem lösen kann, das Sie haben.

Pythons DB-API scheint Ihnen keine Möglichkeit zu geben, Tupel als sicher ersetzte Parameter zu übergeben. Die akzeptierte Antwort von bernie verwendet den Operator Python % für die Ersetzung, was unsicher ist.

Sie müssen jedoch möglicherweise keine Tupel als Parameter übergeben, insbesondere wenn das gewünschte Tupel das Ergebnis einer anderen SQL-Abfrage ist (wie Sie Daniel angedeutet haben). Stattdessen können Sie SQL-Unterabfragen verwenden.

Wenn die Menge der IDs, die Sie in Ihrer IN-Klausel angeben möchten, das Ergebnis von SELECT id FROM other_table WHERE use=true ist, zum Beispiel:

%Vor%

Und das kann auch parametrisiert werden (der sichere Weg). Wenn die IDs, die Sie auswählen möchten, diejenigen mit einem gegebenen parent_id sind:

%Vor%     
rspeer 16.08.2016 22:07
quelle
0

Die akzeptierte Antwort riskiert SQL-Injektion; Sie sollten niemals Benutzereingaben direkt an die Datenbank übergeben. Erstellen Sie stattdessen eine Abfrage mit der korrekten Anzahl von Platzhaltern, und lassen Sie dann pg8000 das Escaping durchführen:

%Vor%     
kielni 07.04.2017 19:15
quelle

Tags und Links