我对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')
如何在加入元素时添加引号。
答案 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"