список питонов в sql запросе как параметр - PullRequest
97 голосов
/ 12 ноября 2008

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

l = [1,5,8]

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

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

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

Ответы [ 11 ]

92 голосов
/ 12 ноября 2008

Ответы до сих пор составляли шаблоны в виде простой строки 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)
22 голосов
/ 22 ноября 2016

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

l = [1,5,8]

l = tuple(l)

params = {'l': l}

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

enter image description here

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

21 голосов
/ 12 ноября 2008

SQL вы хотите

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

Если вы хотите построить это из питона, вы можете использовать

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

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

ОБНОВЛЕНИЕ: С. Лотт упоминает в комментариях, что привязки 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))
10 голосов
/ 05 апреля 2018

Самый простой способ - превратить список в tuple first

t = tuple(l)
query = "select name from studens where id IN {}".format(t)
10 голосов
/ 12 ноября 2008

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

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

(Спасибо, Блэр-Конрад )

6 голосов
/ 20 ноября 2010

Мне нравится ответ Бобинса:

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))
2 голосов
/ 26 ноября 2014

Решение для @umounting ответа, потому что оно порвалось с одноэлементным кортежем, поскольку (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)+'"'))
1 голос
/ 18 августа 2016

Например, если вы хотите запрос 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(']',')') )
0 голосов
/ 23 апреля 2019

более простое решение:

lst = [1,2,3,a,b,c]

query = f"""SELECT * FROM table WHERE IN {str(lst)[1:-1}"""
0 голосов
/ 12 февраля 2019
placeholders= ', '.join("'{"+str(i)+"}'" for i in range(len(l)))
query="select name from students where id (%s)"%placeholders
query=query.format(*l)
cursor.execute(query)

Это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...