Замена параметра на SQLite “В” пункте

Никогда реализация что-либо как одиночный элемент.

можно решить не создать больше чем один экземпляр, но всегда гарантировать Вам, реализация может обработать больше.

я должен все же найти любой сценарий, где использование одиночного элемента является на самом деле правильным поступком.

я вошел в некоторые очень горячие обсуждения этого в последние несколько лет, но в конце я был всегда прав.

41
задан Clinton Blackmore 21 August 2009 в 03:41
поделиться

5 ответов

Вам нужно правильное количество ? 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')]
63
ответ дан 27 November 2019 в 00:21
поделиться

Я всегда делаю что-то вроде этого:

query = 'SELECT * FROM distro WHERE id IN (%s)' % ','.join('?' for i in desired_ids)
c.execute(query, desired_ids)

Нет риска инъекции, потому что вы не помещаете строки из желаемых_идей в запрос напрямую.

3
ответ дан 27 November 2019 в 00:21
поделиться

Обновление: это работает:

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.

12
ответ дан 27 November 2019 в 00:21
поделиться

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.

-1
ответ дан 27 November 2019 в 00:21
поделиться

Согласно http://www.sqlite.org/limits.html (элемент 9), SQLite не может (по умолчанию) обрабатывать более 999 параметров для запрос, поэтому приведенные здесь решения (создание необходимого списка заполнителей) завершатся ошибкой, если у вас есть тысячи элементов, которые вы ищете IN . В этом случае вам нужно будет разбить список, затем перебрать его по частям и самостоятельно объединить результаты.

Если вам не нужны тысячи элементов в предложении IN , то решение Alex - это способ сделать это (и, похоже, именно так это делает Django).

23
ответ дан 27 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: