在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(']',')') )