当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《sql查询中的python列表作为参数》经验,为你挑选了6个好方法。

我有一个python列表,比如l

l = [1,5,8]

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

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

我该如何做到这一点?



1> bobince..:

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


`','.join(占位符*len(l))`会更短,但仍然可读imho
@Thiefmaster:是的,在一般情况下必须是`([placeholder]*len(l))`,因为占位符可能是多个字符.
你为什么要"手工"加入而不是将这项工作留给dbapi?关键是使用元组而不是列表......
基于此答案,这里是适用于*** Python 3.6 ***的单行解决方案:`cursor.execute(f'从其中ID为IN的学生中选择名称({','。join('?'for _ in l})} )',l)`。@bobince,您还应该在解决方案中指出,就避免SQL注入而言,使用`?`是安全的方法。这里有很多容易受到攻击的答案,基本上是将python中的字符串连接起来的答案。

2> Amirhos Iman..:

最简单的方法是将列表转到tuple第一

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


如@renstrm所述,如果l仅包含一个元素,则此操作将无效,您最终将获得id IN(1,)。这是语法错误。

3> Blair Conrad..:

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

的地图功能将改变列表转换成可以通过使用逗号胶合在一起的字符串列表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))


:-( Python SQLite绑定不支持序列.

4> allsyed..:

不要复杂,解决方案很简单.

l = [1,5,8]

l = tuple(l)

params = {'l': l}

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

在此输入图像描述

我希望这有帮助!


如果`l`只包含一个元素,那么这将不起作用,你最终会得到`id IN(1,)`.这是语法错误.
如果l只包含1个元素,请确保它是一个元组,它会起作用.在我看来,这个解决方案比接受的解决方案更清晰.
但是,如果元组为空,它将仍然无法工作,因此在执行查询之前必须进行其他检查。

5> gimel..:

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

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

(谢谢,blair-conrad)



6> jimhark..:

我喜欢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))

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有