IN句にSQLite within Pythonのパラメータ置換を使用しようとしています。SQLite "IN"句のパラメータ置換
import sqlite3
c = sqlite3.connect(":memory:")
c.execute('CREATE TABLE distro (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)')
for name in 'Ubuntu Fedora Puppy DSL SuSE'.split():
c.execute('INSERT INTO distro (name) VALUES (?)', [ name ])
desired_ids = ["1", "2", "5", "47"]
result_set = c.execute('SELECT * FROM distro WHERE id IN (%s)' % (", ".join(desired_ids)),())
for result in result_set:
print result
それが出て出力します:
(1, u'Ubuntu') (2, u'Fedora') (5, u'SuSE')
ドキュメントは、「[あ]なたは、そうするために、Pythonの文字列操作を使用してクエリを組み立てるべきではないと述べているようにここで示して完全に実行されている例がありますあなたのプログラムはSQLインジェクション攻撃に対して脆弱になります。「パラメータ置換を使用したいと思っています。
私は試してみてください。
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ (", ".join(desired_ids)) ])
私は空の結果セットを取得し、私がしようとすると:
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ desired_ids ])
私が手:
InterfaceError: Error binding parameter 0 - probably unsupported type.
私はどんな答えていることを願っていますがこの単純化された問題を解決するには、実行したい実際のクエリが二重にネストされたサブクエリにあることを指摘したいと思います。ウィットには:
UPDATE dir_x_user SET user_revision = user_attempted_revision
WHERE user_id IN
(SELECT user_id FROM
(SELECT user_id, MAX(revision) FROM users WHERE obfuscated_name IN
("Argl883", "Manf496", "Mook657") GROUP BY user_id
)
)
すべての回答ありがとうございます。私が最後に私が代用しているすべてのパラメータに疑問符が必要であることがわかったとき、それは非常に意味がありました。 –