placeholders= ', '.join("'{"+str(i)+"}'" for i in range(len(l)))
query="select name from students where id (%s)"%placeholders
query=query.format(*l)
cursor.execute(query)
>>> 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,)]
sql字符串的其他解决方案:
cursor.execute("select id from test where id in (%s)" % ('"'+'", "'.join(l)+'"'))
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)
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__ 方法),这应该不是问题。但占位符也必须是单个字符。要支持多字符占位符,请使用:
16条答案
按热度按时间0h4hbjxa1#
最简单的方法是把清单转到
tuple
第一c8ib6hqw2#
这将使用参数替换并考虑单值列表的情况:
ws51t4hk3#
这应该能解决你的问题。
7kqas0il4#
如果列表中的值的数目等于1或大于1,则这将起作用
62lalag45#
@umounted answer的解决方案,因为它与一个元素元组断开,因为(1,)不是有效的sql:
sql字符串的其他解决方案:
bmp9r5qi6#
您需要的sql是
如果您想从python构建它,您可以使用
map函数将把这个列表转换成一个字符串列表,可以使用str.join方法用逗号将这些字符串粘在一起。
或者:
如果您更喜欢生成器表达式而不是map函数。
更新:s。lott在评论中提到python-sqlite绑定不支持序列。那样的话,你可能会想要
生成者
thigvfpy7#
连接以逗号分隔的列表值,并使用format运算符形成查询字符串。
(谢谢,布莱尔·康拉德)
6gpjuf908#
到目前为止,答案是将这些值模板化为一个纯sql字符串。对于整数来说,这是完全正确的,但是如果我们想对字符串这样做,我们就会遇到转义问题。
下面是一个使用参数化查询的变体,该查询将同时适用于以下两种情况:
cwtwac6a9#
如果您在psycopg2库中使用postgresql,您可以让它的元组自适应为您执行所有转义和字符串插值,例如:
i、 只要确保你通过了考试
IN
参数作为tuple
. 如果它是一个list
你可以用= ANY
数组语法:请注意,这两个查询都将转换为同一个查询计划,因此您应该使用更简单的查询计划。e、 如果你的列表是一个元组,那么使用前者,如果它们存储在一个列表中,那么使用后者。
0dxa2lsx10#
例如,如果需要sql查询:
关于:
jtoj6r0c11#
这个
:var
符号似乎更简单(python(3.7版)yfwxisqw12#
不要把它复杂化,解决这个问题的方法很简单。
我希望这有帮助!!!
cld4siwp13#
要在字符串列表(而不是int)中运行select from-where字段,请按照以下问题使用
repr(tuple(map(str, l)))
. 完整示例:退货:
select name from students where id in ('a', 'b', 'c')
ldioqlga14#
更简单的解决方案:
30byixjq15#
我喜欢博宾斯的回答:
但我注意到:
可替换为:
我觉得这更直接,如果不那么聪明和一般。在这里
l
必须具有长度(即,引用定义__len__
方法),这应该不是问题。但占位符也必须是单个字符。要支持多字符占位符,请使用: