Tôi đang cố sử dụng thay thế tham số với SQLite within Python cho mệnh đề IN. Đây là một hoạt động ví dụ hoàn chỉnh thể hiện:Thay thế tham số cho mệnh đề "IN" SQLite
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
Nó in ra:
(1, u'Ubuntu') (2, u'Fedora') (5, u'SuSE')
Như các tài liệu nêu rằng "[y] ou không nên lắp ráp truy vấn của bạn sử dụng các hoạt động chuỗi Python vì làm như vậy không an toàn, nó làm cho chương trình của bạn dễ bị tấn công SQL injection, "Tôi hy vọng sẽ sử dụng thay thế tham số.
Khi tôi cố gắng:
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ (", ".join(desired_ids)) ])
tôi nhận được một tập kết quả có sản phẩm nào, và khi tôi thử:
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ desired_ids ])
tôi nhận được:
InterfaceError: Error binding parameter 0 - probably unsupported type.
Trong khi tôi hy vọng rằng bất kỳ câu trả lời vấn đề đơn giản hóa này sẽ hoạt động, tôi muốn chỉ ra rằng truy vấn thực tế mà tôi muốn thực hiện nằm trong truy vấn con lồng nhau gấp đôi. Để wit:
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
)
)
Cảm ơn tất cả các câu trả lời. Nó đã có rất nhiều ý nghĩa khi tôi cuối cùng đã thấy rằng tôi chỉ cần một dấu hỏi cho mỗi tham số tôi thay thế. –