Wie erstelle ich eine SELECT-Anweisung mit einer Liste als Parameter?

Code

Der folgende Code funktioniert nur, wenn die Liste targets_in_sw nur einen Wert hat:

 sw_current = cursor.execute("SELECT * from SOFTWARE_") sw_current = sw_current.fetchall() for sw_item in sw_current: current_software_id = sw_item[0] # Create Software XML Element sw_element = ET.SubElement(root, "Software") # Get all Targets for current sw_element targets_in_sw = cursor.execute("SELECT TARGET2 from SOFTWARE_TARGET_ WHERE SOFTWARE1=?", (current_software_id,)) targets_in_software = targets_in_sw.fetchall() targets_in_software = list(chain.from_iterable(targets_in_sw)) # Get all Target IDs for current sw_element current_target_IDs = cursor.execute("SELECT * from TARGET_ WHERE id_=?", targets_in_software) current_target_IDs = current_target_IDs.fetchall() ## The following line ONLY prints when my list contains one value ## print current_target_IDs 

Frage

Wie kann ich das ändern, damit ich alles aus TARGET_ auswählen kann, wenn targets_in_software eine Liste mehrerer Werte ist?

Notizen:

Falls du die Tags nicht gesehen hast, verwende ich SQLite3 .

Hier ist ein Beispiel für die Werte in targets_in_software beim Durchlaufen der Schleife:

 iteration targets_in_software 1 [21] 2 [28] 3 [29] 4 [91] 5 [92] 6 [94] 7 [217] 8 [218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228] 9 [251] 10 [261] ...etc. 

  • Warum bekomme ich plötzlich "OperationalError: kein solcher Tisch"?
  • Fehler beim Zugriff auf die im Django erstellte Tabelle im Python-Code
  • So verwenden Sie den Vakuumbefehl von SQLite 3 in Python
  • Gleichzeitiges Schreiben mit sqlite3
  • Verbinden Sie mit Pythons sqlite Modul ist langsamer als es manuell zu tun
  • Textdatei in sqlite3 Datenbank mit Python
  • Untersuchen dann die Aktualisierung von Zeilen in sqlite mit Python
  • Sqlite - Verwenden Sie Backticks (`) oder doppelte Anführungszeichen (") mit Python
  • 4 Solutions collect form web for “Wie erstelle ich eine SELECT-Anweisung mit einer Liste als Parameter?”

    Ihre rohe SQL-Abfrage sollte so aussehen:

    SELECT val FROM table_name WHERE ref_val in ('val_one','val_two');

    Also für deinen Fall solltest du tun:

    targets_in_sw = cursor.execute("SELECT TARGET2 from SOFTWARE_TARGET_ WHERE SOFTWARE1=(" + ",".join(targets_in_software) + ");")

    Bitte beachten Sie, dass dies Sie nicht gegen SQL-Injektion schützen wird.

    Sie können ur Abfrage auf diese Weise mit in erstellen

     SELECT * from TARGET_ WHERE id in tuple(targets_in_software) 

    Dies funktioniert, wenn targets_in_software mehrere Werte hat.

    Sie müssen den SQL IN Operator mit Ihrem ORM verwenden. Ich habe nicht genug Details zu wissen, was du benutzt hast. Probieren Sie SELECT TARGET2 from SOFTWARE_TARGET_ WHERE SOFTWARE1 IN ? Oder SELECT TARGET2 from SOFTWARE_TARGET_ WHERE SOFTWARE1 IN ? Mit sw_item als Parameter anstelle von current_software_id.

    Wenn Sie ein Tupel als zweiten Parameter der Ausführung übergeben, wird es versuchen, jedes Element des Tupels für die Platzhalter in der Abfragezeichenfolge zu ersetzen, zum Beispiel:

     stmt = "INSERT INTO mytable (name, id, rank) VALUES (%s, %s, %s)" cursor.execute(stmt, (a, b, c)) 

    Erstellt eine Abfrage, bei der jeder% s durch ein Element des Tupels ersetzt wird. In deinem Fall willst du am Ende mit einer Abfrage, wo das gesamte Tupel zusammen an einem Ort ist, also musst du es in einen String konvertieren:

     stmt = "SELECT * from TARGET_ WHERE id_ IN %s" #convert list of ints to tuple of strings stmt_param = str(tuple(map(str, targets_in_software))) cursor.execute(stmt, stmt_param) 

    Ich denke, das sollte funktionieren, obwohl ich es nicht testen konnte, weil ich keine Datenbank zum Testen habe. Ich hoffe das hilft.

    Python ist die beste Programmiersprache der Welt.