Подтвердить что ты не робот

Список python в sql-запросе как параметр

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

l = [1,5,8]

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

"выберите имя из учеников, где id = | В СПИСКЕ l |"

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

4b9b3361

Ответ 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

Требуемый 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)) + ')'

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

UPDATE: S. Lott упоминает в комментариях, что привязки SQLite Python не поддерживают последовательности. В этом случае вам может понадобиться

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))

Ответ 3

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

l = [1,5,8]

l = tuple(l)

params = {'l': l}

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

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

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

Ответ 4

string.join значения списка, разделенные запятыми, и используйте , чтобы сформировать строку запроса.

myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist))

(Спасибо, blair-conrad)

Ответ 5

Мне нравится bobince answer:

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)

Но я заметил это:

placeholders= ', '.join(placeholder for unused in l)

Можно заменить на:

placeholders= ', '.join(placeholder*len(l))

Я считаю это более прямым, менее умным и менее общим. Здесь l требуется длина (т.е. Обратитесь к объекту, который определяет метод __len__), что не должно быть проблемой. Но заполнитель также должен быть единственным персонажем. Для поддержки использования многосимвольного заполнителя:

placeholders= ', '.join([placeholder]*len(l))

Ответ 6

Например, если вам нужен запрос sql:

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

Как насчет:

my_list = [1, 5, 8]
cur.execute("select name from studens where id in %s" % repr(my_list).replace('[','(').replace(']',')') )

Ответ 7

Решение для @umounted ответа, потому что это сломалось с одноэлементным кортежем, поскольку (1) недействителен SQL.:

>>> random_ids = [1234,123,54,56,57,58,78,91]
>>> cursor.execute("create table test (id)")
>>> for item in random_ids:
    cursor.execute("insert into test values (%d)" % item)
>>> sublist = [56,57,58]
>>> cursor.execute("select id from test where id in %s" % str(tuple(sublist)).replace(',)',')'))
>>> a = cursor.fetchall()
>>> a
[(56,), (57,), (58,)]

Другое решение для строки sql:

cursor.execute("select id from test where id in (%s)" % ('"'+'", "'.join(l)+'"'))