"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?

InformationsquelleAutor glibdud | 2013-02-23
Schreibe einen Kommentar