Никогда реализация что-либо как одиночный элемент.
можно решить не создать больше чем один экземпляр, но всегда гарантировать Вам, реализация может обработать больше.
я должен все же найти любой сценарий, где использование одиночного элемента является на самом деле правильным поступком.
я вошел в некоторые очень горячие обсуждения этого в последние несколько лет, но в конце я был всегда прав.
Вам нужно правильное количество ?
s, но это не создает риска внедрения SQL:
>>> result_set = c.execute('SELECT * FROM distro WHERE id IN (%s)' %
','.join('?'*len(desired_ids)), desired_ids)
>>> print result_set.fetchall()
[(1, u'Ubuntu'), (2, u'Fedora'), (5, u'SuSE')]
Я всегда делаю что-то вроде этого:
query = 'SELECT * FROM distro WHERE id IN (%s)' % ','.join('?' for i in desired_ids)
c.execute(query, desired_ids)
Нет риска инъекции, потому что вы не помещаете строки из желаемых_идей в запрос напрямую.
Обновление: это работает:
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)' % ("?," * len(desired_ids))[:-1], desired_ids)
for result in result_set:
print result
Проблема заключалась в том, что он вам нужен? для каждого элемента во входном списке.
Оператор ("?," * len (required_ids)) [: - 1]
создает повторяющуюся строку "?,", а затем обрезает последнюю запятая. так что есть один вопросительный знак для каждого элемента в required_ids.
In case sqlite has problem with the length of sql request the indefinite number of question marks can be some kind of way to beak things.
Согласно http://www.sqlite.org/limits.html (элемент 9), SQLite не может (по умолчанию) обрабатывать более 999 параметров для запрос, поэтому приведенные здесь решения (создание необходимого списка заполнителей) завершатся ошибкой, если у вас есть тысячи элементов, которые вы ищете IN
. В этом случае вам нужно будет разбить список, затем перебрать его по частям и самостоятельно объединить результаты.
Если вам не нужны тысячи элементов в предложении IN
, то решение Alex - это способ сделать это (и, похоже, именно так это делает Django).