为每个列表元素添加引号

问题描述 投票:31回答:4

我是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')

如何在连接元素时添加引号。

python
4个回答
60
投票

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

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

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

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

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


9
投票

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

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

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


4
投票

正如你问的那样,用这个:

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

由于您正在创建SQL查询,请使用数据库库的输入卫生功能(example for mysqldb)。你不想最终遇到像Bobby Tables这样的问题。


1
投票

一般情况下(忽略SQL)

In [3]: print(' '.join('"%s"' % x for x in ['a', 'b']))                                                                                                                                              
"a" "b"
© www.soinside.com 2019 - 2024. All rights reserved.