2

次のようなSQLステートメントを実行したいと思います。

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

Pythonsqlite3モジュールのドキュメントには次のように書かれています。

Cursor.execute(sql [、parameters])

[...]

sqlite3モジュールは、疑問符(qmarkスタイル)と名前付きプレースホルダー(名前付きスタイル)の2種類のプレースホルダーをサポートします。

しかし、qmarkスタイルとnamedスタイルの両方を使用する方法はありますか?

解決策(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)
4

1 に答える 1

4

これがあなたのコードの場合:

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

両方の方法を一緒に使用することはできないと思いますが、それは1つの選択肢です。

于 2012-04-20T13:55:48.883 に答える