"SELECT ... WHERE ... IN" mit einer unbekannten Anzahl von Parametern
Ich bin versucht, führen Sie eine Abfrage in der form von...
SELECT col2 FROM tab WHERE col1 IN (val1, val2, val3...)
...wo die Werte gespeichert werden in einer Python-Liste/Tupel beliebiger Länge. Ich kann nicht scheinen zu finden, eine "saubere" Weg, es zu tun.
>>> db = connect(":memory:")
>>> db.execute("CREATE TABLE tab (col1 INTEGER, col2 TEXT)")
>>> db.execute("INSERT INTO tab VALUES(1,'one')")
>>> db.execute("INSERT INTO tab VALUES(2,'two')")
>>> db.execute("INSERT INTO tab VALUES(3,'three')")
>>> db.execute("INSERT INTO tab VALUES(4,'four')")
>>> db.execute("INSERT INTO tab VALUES(5,'five')")
>>> db.commit()
# Expected result
>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (1,3,4)").fetchall()
[(u'one',), (u'three',), (u'four',)]
>>> vals = (1,3,4)
>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", vals).fetchall()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied.
>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", (vals,)).fetchall()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", (','.join(str(val) for val in vals),)).fetchall()
[]
>>>
Kann ich jetzt tun die folgende, die (glaube ich... bitte korrigiert mich wenn ich falsch Liege) behält die Sicherheit der built-in-parameter-substitution, aber es ist immer noch ein bisschen hässlich:
>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (" + ",".join("?"*len(vals)) + ")", vals).fetchall()
[(u'one',), (u'three',), (u'four',)]
>>>
Ist, dass meine beste option, oder gibt es eine schönere Möglichkeit, um dieses?
- möglich, Duplikat der SQLite: bind Liste der Werte, die "WHERE col IN ( :PRM )"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist Ihre beste option , ohne zusätzliche Bibliotheken. Ich habe natürlich befürwortet nur, dass die Technik in der Vergangenheit, mehr als einmal in der Tat.
Könnte man auch Schalter zur Verwendung von SQLAlchemy, die SQL-Generierung für Sie, aber das erfordert das erklimmen der Lernkurve und schreiben die meisten Ihrer Anwendung.
Eine einfache und saubere Lösung ist: