sql查询中的python列表作为参数

时间:2008-11-12 11:18:32

标签: python sql

我有一个python列表,比如说l

l = [1,5,8]

我想编写一个sql查询来获取列表中所有元素的数据,比如说

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

我如何做到这一点?

16 个答案:

答案 0 :(得分:91)

到目前为止,答案一直在将值模板化为纯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)

答案 1 :(得分:22)

不要复杂,解决方法很简单。

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

我希望这有帮助!!!

答案 2 :(得分:21)

您想要的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)) + ')'

如果您更喜欢generator expressions到地图功能。

更新:S. Lott在评论中提到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))

答案 3 :(得分:11)

最简单的方法是将列表首先变为tuple

t = tuple(l)
query = "select name from studens where id IN {}".format(t)

答案 4 :(得分:10)

string.join以逗号分隔的列表值,并使用format operator形成查询字符串。

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

(谢谢,blair-conrad

答案 5 :(得分:6)

我喜欢bobince的回答:

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 :(得分:2)

@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 string的其他解决方案:

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

答案 7 :(得分:1)

例如,如果你想要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(']',')') )

答案 8 :(得分:1)

l = [1] # or [1,2,3]

query = "SELECT * FROM table WHERE id IN :l"
params = {'l' : tuple(l)}
cursor.execute(query, params)

:var表示法似乎更简单。 (Python 3.7)

答案 9 :(得分:0)

这使用参数替换并处理单个值列表的情况:

l = [1,5,8]

get_operator = lambda x: '=' if len(x) == 1 else 'IN'
get_value = lambda x: int(x[0]) if len(x) == 1 else x

query = 'SELECT * FROM table where id ' + get_operator(l) + ' %s'

cursor.execute(query, (get_value(l),))

答案 10 :(得分:0)

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)

这应该可以解决您的问题。

答案 11 :(得分:0)

更简单的解决方案:

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

query = f"""SELECT * FROM table WHERE IN {str(lst)[1:-1}"""

答案 12 :(得分:0)

如果您将PostgreSQL与Psycopg2库一起使用,则可以让其tuple adaption为您完成所有转义和字符串插值,例如:

ids = [1,2,3]
cur.execute(
  "SELECT * FROM foo WHERE id IN %s",
  [tuple(ids)])

即只要确保您将IN参数作为tuple传递即可。如果是list,则可以使用= ANY array syntax

cur.execute(
  "SELECT * FROM foo WHERE id = ANY (%s)",
  [list(ids)])

请注意,这两个都将变成相同的查询计划,因此您只应使用较容易的那个即可。例如如果您的列表位于元组中,请使用前者;如果它们存储在列表中,请使用后者。

答案 13 :(得分:0)

如果列表中的值数等于1或大于1,这将起作用

t = str(tuple(l))
if t[-2] == ',':
   t= t.replace(t[-2],"")
query = "select name from studens where id IN {}".format(t)

答案 14 :(得分:0)

如果使用元组功能进行操作,只需使用内联:

query = "Select * from hr_employee WHERE id in " % tuple(employee_ids) if len(employee_ids) != 1 else "("+ str(employee_ids[0]) + ")"

答案 15 :(得分:0)

要从字段在字符串列表中的位置(而不是int)运行选择,请enter image description here使用repr(tuple(map(str, l)))。完整示例:

l = ['a','b','c']
sql = f'''

select name 
from students 
where id in {repr(tuple(map(str, l)))}
'''
print(sql)

返回: select name from students where id in ('a', 'b', 'c')