2 Stimmen

Python sqlite3 mit benannten und qmark-Parametern ausführen

Ich möchte eine SQL-Anweisung wie diese ausführen:

SELECT * FROM table WHERE spam LIKE ? AND eggs LIKE :eggs

Die Dokumentation des Python-Moduls sqlite3 sagt:

Cursor.execute(sql[, Parameter])

[...]

Das Modul sqlite3 unterstützt zwei Arten von Platzhaltern: Fragezeichen (qmark style) und benannte Platzhalter (named style).

Aber gibt es eine Möglichkeit, sowohl qmark style als auch named style zu verwenden?

LÖSUNG (Dank an jadkik94):

params = ["a","b","c"]
kparams = {'d':"d", 'e':"e"}
sql = "SELECT * FROM table WHERE (a LIKE ? OR b LIKE ? OR c LIKE ?) AND (d LIKE :d AND e LIKE :e)"
sql = sql.replace("?", ":{}").format(*range(sql.count("?")))
# >>> sql
# "SELECT * FROM table WHERE (a like :0 OR b like :1 OR c like :2) AND (d like :d AND e like :e)"
kparams.update(dict(map(lambda x: (str(x[0]), x[1]), enumerate(params))))
# >>> kparams
# {'0': 'a', '1': 'b', '2': 'c', 'd': 'd', 'e': 'e'}
c.execute(sql, kparams)

4voto

jadkik94 Punkte 6844

Wenn dies Ihr Code ist:

known = {'d': 'dval', 'e': 'eval'}
unknown = ['a', 'b', 'c']
# instead of
"SELECT * FROM table WHERE (a like ? OR b like ? OR c like ?) AND (d like :d AND e like :e)"
known.update(dict((str(i), v) for i, v in enumerate(unknown)))
# and use
"SELECT * FROM table WHERE (a like :1 OR b like :2 OR c like :3) AND (d like :d AND e like :e)"

Ich vermute, dass man nicht beide Möglichkeiten gleichzeitig nutzen kann, aber das ist eine Alternative.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X