我有一个python列表,比如l
l = [1,5,8]
Run Code Online (Sandbox Code Playgroud)
我想编写一个sql查询来获取列表中所有元素的数据
select name from students where id = |IN THE LIST l|
Run Code Online (Sandbox Code Playgroud)
我该如何做到这一点?
bob*_*nce 97
到目前为止,答案一直在将值模板化为纯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)
Run Code Online (Sandbox Code Playgroud)
Ami*_*ani 31
最简单的方法是将列表转到tuple第一
t = tuple(l)
query = "select name from studens where id IN {}".format(t)
Run Code Online (Sandbox Code Playgroud)
Bla*_*rad 21
你想要的SQL是
select name from studens where id in (1, 5, 8)
Run Code Online (Sandbox Code Playgroud)
如果你想从你可以使用的python构造它
l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join(map(str, l)) + ')'
Run Code Online (Sandbox Code Playgroud)
的地图功能将改变列表转换成可以通过使用逗号胶合在一起的字符串列表str.join方法.
或者:
l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join((str(n) for n in l)) + ')'
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢生成器表达式到map函数.
更新:S.Lott在评论中提到Python SQLite绑定不支持序列.在这种情况下,您可能想要
select name from studens where id = 1 or id = 5 or id = 8
Run Code Online (Sandbox Code Playgroud)
由...生成
sql_query = 'select name from studens where ' + ' or '.join(('id = ' + str(n) for n in l))
Run Code Online (Sandbox Code Playgroud)
all*_*yed 21
不要复杂,解决方案很简单.
l = [1,5,8]
l = tuple(l)
params = {'l': l}
cursor.execute('SELECT * FROM table where id in %(l)s',params)
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!
gim*_*mel 10
string.join以逗号分隔的列表值,并使用format运算符形成查询字符串.
myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist))
Run Code Online (Sandbox Code Playgroud)
(谢谢,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)
Run Code Online (Sandbox Code Playgroud)
但我注意到了这一点:
placeholders= ', '.join(placeholder for unused in l)
Run Code Online (Sandbox Code Playgroud)
可以替换为:
placeholders= ', '.join(placeholder*len(l))
Run Code Online (Sandbox Code Playgroud)
如果不那么聪明而不那么普遍,我会发现这更直接.这里l需要有一个长度(即引用定义__len__方法的对象),这应该不是问题.但占位符也必须是单个字符.要支持多字符占位符,请使用:
placeholders= ', '.join([placeholder]*len(l))
Run Code Online (Sandbox Code Playgroud)
如果您将 PostgreSQL 与 Psycopg2 库一起使用,您可以让它的元组适应为您完成所有转义和字符串插值,例如:
ids = [1,2,3]
cur.execute(
"SELECT * FROM foo WHERE id IN %s",
[tuple(ids)])
Run Code Online (Sandbox Code Playgroud)
即只需确保您将IN参数作为tuple. 如果是 alist你可以使用= ANY数组语法:
cur.execute(
"SELECT * FROM foo WHERE id = ANY (%s)",
[list(ids)])
Run Code Online (Sandbox Code Playgroud)
请注意,这两者都会变成相同的查询计划,因此您应该只使用更容易的一个。例如,如果您的列表位于元组中,则使用前者,如果它们存储在列表中,则使用后者。
小智 5
只需使用元组函数的内联 if 操作:
query = "Select * from hr_employee WHERE id in " % tuple(employee_ids) if len(employee_ids) != 1 else "("+ str(employee_ids[0]) + ")"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
92556 次 |
| 最近记录: |