У меня есть список питонов, скажем я
l = [1,5,8]
Я хочу написать sql-запрос, чтобы получить данные для всех элементов списка, скажем
select name from students where id = |IN THE LIST l|
Как мне этого добиться?
Ответы до сих пор представляли собой шаблон значений в простой строке SQL. Это абсолютно нормально для целых чисел, но если мы хотим сделать это для строк, мы получим проблему с экранированием.
Вот вариант, использующий параметризованный запрос, который будет работать для обоих:
placeholder= '?' # For SQLite. See DBAPI paramstyle.
placeholders= ', '.join(placeholder for unused in l)
query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders
cursor.execute(query, l)
','.join(placeholder * len(l))
будет немного короче, но все равно читабельно imho([placeholder]*len(l))
в общем случае, поскольку заполнитель может состоять из нескольких символов.cursor.execute(f'SELECT name FROM students WHERE id IN ({','.join('?' for _ in l)})', l)
. @bobince, вы также должны отметить в своем решении, что использование?
- это безопасный способ избежать внедрения SQL. Здесь есть множество уязвимых ответов, в основном те, которые объединяют строки в python.Самый простой способ - поставить список
tuple
первымисточник
Не усложняйте это, решение простое.
Надеюсь, это помогло !!!
источник
l
содержит только один элемент, и вы получитеid IN (1,)
. Это синтаксическая ошибка.sqlite3
. С какой библиотекой вы это тестировали?Вам нужен SQL
Если вы хотите построить это из питона, вы можете использовать
Функция map преобразует список в список строк, которые можно склеить запятыми с помощью метода str.join .
В качестве альтернативы:
если вы предпочитаете выражения генератора функции карты.
ОБНОВЛЕНИЕ: С. Лотт упоминает в комментариях, что привязки Python SQLite не поддерживают последовательности. В этом случае вы можете захотеть
Создан
источник
строка. соедините значения списка, разделенные запятыми, и используйте оператор формата для формирования строки запроса.
(Спасибо, Блэр-Конрад )
источник
%
используется простое форматирование строки Python.Мне нравится ответ Бобинса:
Но я заметил вот что:
Можно заменить на:
Я считаю это более прямым, хотя и менее умным и менее общим. Здесь
l
требуется указать длину (то есть ссылаться на объект, определяющий__len__
метод), что не должно быть проблемой. Но заполнитель также должен быть одиночным символом. Для поддержки использования многосимвольных заполнителей:источник
Решение для @umounted ответа, потому что это сломалось с одноэлементным кортежем, поскольку (1,) не является допустимым SQL .:
Другое решение для строки sql:
источник
Это должно решить вашу проблему.
источник
Если вы используете PostgreSQL с библиотекой Psycopg2, вы можете позволить его адаптации кортежа делать за вас все экранирование и интерполяцию строк, например:
т.е. просто убедитесь, что вы передаете
IN
параметр какtuple
. если это,list
вы можете использовать= ANY
синтаксис массива :обратите внимание, что они оба будут преобразованы в один и тот же план запроса, поэтому вам следует просто использовать то, что проще. например, если ваш список входит в состав кортежа, используйте первое, если они хранятся в списке, используйте второе.
источник
Например, если вам нужен запрос sql:
Что о:
источник
более простое решение:
источник
:var
Нотация кажется проще. (Python 3.7)источник
Здесь используется подстановка параметров и учитывается случай списка с одним значением:
источник