Вопрос-Ответ

Python list in SQL query as parameter [duplicate]

Список Python в SQL-запросе в качестве параметра

У меня есть список Python, скажем

l = [1,5,8]

Я хочу написать SQL-запрос, чтобы получить данные для всех элементов списка, скажем

select name from students where id = |IN THE LIST l|

Как мне это сделать?

Переведено автоматически
Ответ 1

Ответы до сих пор заключались в преобразовании значений в простую строку 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)
Ответ 2

Самый простой способ - сначала преобразовать список в tuple

t = tuple(l)
query = "select name from studens where id IN {}".format(t)
Ответ 3

Не усложняйте, решение для этого простое.

l = [1,5,8]

l = tuple(l)

params = {'l': l}

cursor.execute('SELECT * FROM table where id in %(l)s',params)

введите описание изображения здесь

Надеюсь, это помогло!!!

Ответ 4

Нужный вам SQL

select name from studens where id in (1, 5, 8)

Если вы хотите создать это из python, вы могли бы использовать

l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join(map(str, l)) + ')'

Функция map преобразует список в список строк, которые можно склеить запятыми с помощью метода str.join.

Альтернативно:

l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join((str(n) for n in l)) + ')'

если вы предпочитаете выражения генератора функции map.

ОБНОВЛЕНИЕ: С. Лотт упоминает в комментариях, что привязки Python SQLite не поддерживают последовательности. В этом случае вы можете захотеть

select name from studens where id = 1 or id = 5 or id = 8

Сгенерирован

sql_query = 'select name from studens where ' + ' or '.join(('id = ' + str(n) for n in l))
2024-01-01 13:58 python