为每个列表元素添加引号

时间:2011-07-19 00:59:05

标签: python

我对python很新。我需要一个简单明了的脚本来为每个列表元素添加引号。让我解释一下。这是我的代码。

parameters = ['a', 'b', 'c']
query = "SELECT * FROM foo WHERE bar IN (%s)" % (', '.join(parameters))

我想用它来查询。但结果是无效查询。结果如下。

SELECT * FROM foo WHERE bar IN (a, b, c, d)

我想要这样:

SELECT * FROM foo WHERE bar IN ('a', 'b', 'c', 'd')

如何在加入元素时添加引号。

4 个答案:

答案 0 :(得分:58)

一个天真的解决方案是迭代你的parameters列表,并在每个元素的开头和结尾添加引号:

(', '.join('"' + item + '"' for item in parameters))

注意:这很容易受到SQL注入的攻击(无论是巧合还是故意)。更好的解决方案是让数据库引用并插入这些值:

query = "SELECT * FROM foo WHERE bar IN (%s)" % ','.join('?' * len(params))
cursor.execute(query, params)

更容易阅读和正确处理报价。

答案 1 :(得分:9)

对于简单参数,以下内容应该有效:

query = "SELECT * FROM foo WHERE bar IN %s" % repr(tuple(map(str,parameters)))

当参数名称本身包含引号时,这可能会中断,因为转义规则不同。

答案 2 :(得分:4)

正如您所说,请使用:

parameters = ['a', 'b', 'c']
', '.join(map(lambda x: "'" + x + "'", parameters))

由于您正在创建SQL查询,请使用数据库库中有关输入卫生的功能(example for mysqldb)。您不希望最终遇到Bobby Tables等问题。

答案 3 :(得分:0)

一般(忽略SQL)

In [3]: print(' '.join('"%s"' % x for x in ['a', 'b']))                                                                                                                                              
"a" "b"