考虑一下我有一个客户名单:
lst = ['John','Jack','Martin']
变量中的所需输出:'John','Jack','Martin'
我可以使用类似",".join(lst)
的内容,然后使用更多字符串格式来实现此目的。有没有明确和更直接的方法呢?
我的想法是在SQL where
子句中传递字符串的元素。
答案 0 :(得分:11)
不使用它来生成SQL查询。请改用数据库驱动程序SQL参数。你无法希望正确地逃脱SQL注入攻击的方式。
如果您需要使用WHERE .. IN ..
测试,请生成占位符:
query = 'SELECT * FROM table WHERE column IN ({})'.format(','.join(['%s'] * len(lst)))
cursor.execute(query, lst)
对于其他所有内容,使用列表推导将引号添加到值中,然后使用逗号连接结果:
', '.join(['"{}"'.format(value) for value in lst])
演示:
>>> lst = ['John','Jack','Martin']
>>> ', '.join(['"{}"'.format(value) for value in lst])
'"John", "Jack", "Martin"'
>>> print ', '.join(['"{}"'.format(value) for value in lst])
"John", "Jack", "Martin"
这将始终使用"
双引号;如果您必须使用单引号,只需使用"'{}'"
作为模板。
答案 1 :(得分:4)
如果您将此传递给SQL并且它是用户提供的数据,那么您应该查看将为您处理正确引用/参数化的模块,例如: Postgres的psycopg2
。我相信MySQL有一个等价物。
使用像str.join
这样的简单技术可能会让您对SQL注入攻击持开放态度,除非您在切换到SQL之前非常小心地检查结果。
如何在psycopg2
中执行此操作的示例:
http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries
作为一个副作用,这也为你处理类型,即它知道将整数作为数字传递,将字符串作为引用的字符串传递等。
答案 2 :(得分:0)
步骤1.实际更改列表的每个元素,使其带引号(如果它不是字符串,则将其转换为字符串。)
f = lambda x: "'"+str(x)+"'"
lst = map(f,lst)
步骤2.使用逗号,
','.join(lst)
>>> f = lambda x: "'"+str(x)+"'"
>>> lst = [1,2,3,4,5]
>>> lst = map(f,lst)
>>> lst
["'1'", "'2'", "'3'", "'4'", "'5'"]
>>> ','.join(lst)
"'1','2','3','4','5'"
答案 3 :(得分:0)
如果您使用的是兼容odbc的数据库。 取自pyodbc文档:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < ?
and bill_overdue = ?
""", '2001-01-01', 1)
使用列表:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < ?
and bill_overdue = ?
""", lst)
答案 4 :(得分:0)
您可以使用repr
使每个字符串成为有效的Python输入:
lst = ['John','Jack','Martin']
output = ','.join(map(repr,lst))
答案 5 :(得分:0)
要获得所需的输出,您仍然可以使用true
false
false
,如下所示:
join
这会显示:
lst = ['John','Jack','Martin']
print "'"+"','".join(lst)+"'"
或者,您可以使用'John','Jack','Martin'
来避免字符串连接:
format()
请注意其他关于其与SQL一起使用的评论。