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

到目前为止的解决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)

25a520a06ff5197b56a24db578430e3d.png

我希望这有助于!

我喜欢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(']',')') )

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值