我有一个python列表,比如l
l = [1,5,8]
我想编写一个sql查询来获取列表中所有元素的数据
select name from students where id = |IN THE LIST l|
我该如何做到这一点?
到目前为止,答案一直在将值模板化为纯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)
最简单的方法是将列表转到tuple
第一
t = tuple(l) query = "select name from studens where id IN {}".format(t)
你想要的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))
不要复杂,解决方案很简单.
l = [1,5,8] l = tuple(l) params = {'l': l} cursor.execute('SELECT * FROM table where id in %(l)s',params)
我希望这有帮助!
string.join以逗号分隔的列表值,并使用format运算符形成查询字符串.
myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist))
(谢谢,blair-conrad)
我喜欢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))