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

我有一个python列表,说l

l = [1,5,8] 

我想写一个SQL查询来获取列表的所有元素的数据,说

“从studens中select名字id = |在列表中l |”

我如何解决这个问题?

到目前为止的解决scheme已经将这些值模板化为普通的SQLstring。 对于整数来说,这绝对是好事,但是如果我们想为string做这个事情,我们就会遇到逃避的问题。

这是一个使用参数化查询的变体,可以同时用于:

 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) 

你想要的SQL是

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

如果你想从python构build你可以使用

 l = [1, 5, 8] sql_query = 'select name from studens where id in (' + ','.join(map(str, l)) + ')' 

map函数将把列表转换成可以用逗号使用str.join方法粘在一起的string列表。

或者:

 l = [1, 5, 8] sql_query = 'select name from studens where id in (' + ','.join((str(n) for n in l)) + ')' 

如果你喜欢生成器expression式的地图function。

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

string.join以逗号分隔的列表值,并使用format操作符来形成一个查询string。

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

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

不要让它复杂化,解决这个问题很简单。

 l = [1,5,8] l = tuple(l) params = {'l': l} cursor.execute('SELECT * FROM table where id in %(l)s',params) 

在这里输入图像描述

我希望这有助于!

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

可以replace为:

 placeholders= ', '.join(placeholder*len(l)) 

我觉得这更直接,如果不那么聪明,不太一般。 这里l需要有一个长度(即引用一个定义__len__方法的对象),这不应该是一个问题。 但占位符也必须是单个字符。 要支持多字符占位符使用:

 placeholders= ', '.join([placeholder]*len(l)) 

因为(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,)] 

其他解决scheme的SQLstring:

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

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