sql查询中python列表作为参数

rbl8hiat  于 2021-05-29  发布在  Hadoop
关注(0)|答案(16)|浏览(524)

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

l = [1,5,8]

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

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

我如何做到这一点?

0h4hbjxa

0h4hbjxa1#

最简单的方法是把清单转到 tuple 第一

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

c8ib6hqw2#

这将使用参数替换并考虑单值列表的情况:

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

ws51t4hk3#

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)

这应该能解决你的问题。

7kqas0il

7kqas0il4#

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

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

62lalag45#

@umounted answer的解决方案,因为它与一个元素元组断开,因为(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)+'"'))
bmp9r5qi

bmp9r5qi6#

您需要的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函数。
更新: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))
thigvfpy

thigvfpy7#

连接以逗号分隔的列表值,并使用format运算符形成查询字符串。

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

(谢谢,布莱尔·康拉德)

6gpjuf90

6gpjuf908#

到目前为止,答案是将这些值模板化为一个纯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)
cwtwac6a

cwtwac6a9#

如果您在psycopg2库中使用postgresql,您可以让它的元组自适应为您执行所有转义和字符串插值,例如:

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

i、 只要确保你通过了考试 IN 参数作为 tuple . 如果它是一个 list 你可以用 = ANY 数组语法:

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

请注意,这两个查询都将转换为同一个查询计划,因此您应该使用更简单的查询计划。e、 如果你的列表是一个元组,那么使用前者,如果它们存储在一个列表中,那么使用后者。

0dxa2lsx

0dxa2lsx10#

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

jtoj6r0c11#

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

yfwxisqw

yfwxisqw12#

不要把它复杂化,解决这个问题的方法很简单。

l = [1,5,8]

l = tuple(l)

params = {'l': l}

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


我希望这有帮助!!!

cld4siwp

cld4siwp13#

要在字符串列表(而不是int)中运行select from-where字段,请按照以下问题使用 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')

ldioqlga

ldioqlga14#

更简单的解决方案:

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

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

30byixjq15#

我喜欢博宾斯的回答:

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

相关问题