为每个列表元素添加引号

Zec*_*eck 32 python

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

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

我想用它来查询.但结果是无效查询.这是结果.

SELECT * FROM foo WHERE bar IN (a, b, c, d)
Run Code Online (Sandbox Code Playgroud)

我想这样:

SELECT * FROM foo WHERE bar IN ('a', 'b', 'c', 'd')
Run Code Online (Sandbox Code Playgroud)

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

Ble*_*der 62

一个天真的解决方案是遍历您的parameters列表并将引号附加到每个元素的开头和结尾:

(', '.join('"' + item + '"' for item in parameters))
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • `["'"+ item +"'"参数中的项目]`会给他单引号,这就是他要求的. (2认同)
  • 挑剔,你不需要这里的列表 []: (', '.join('"' + item + '"' for item in parameters)) (2认同)
  • @EsbenEickhardt:`psycopg2` 使用 `%s`(用于所有内容,而不仅仅是字符串)而不是 `?`。 (2认同)

Sam*_*uby 9

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

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

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


rob*_*ert 8

正如你所问的,使用这个:

parameters = ['a', 'b', 'c']
', '.join(map(lambda x: "'" + x + "'", parameters))
Run Code Online (Sandbox Code Playgroud)

由于您正在创建 SQL 查询,请使用您的数据库库的有关输入卫生的功能(例如 mysqldb)。您不希望以Bobby Tables 之类的问题结束。