从值数组

时间:2018-05-15 13:24:07

标签: python

根据这个answer,构建一个安全的参数化SQL语句的正确方法是使用元组来对查询进行字符串格式化,如下所示:

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

但是,在我的情况下,值存储在长度可以变化的数组中。我正在尝试创建如下所示的参数化SQL语句,但我有一个我不理解的语法错误:

values = ["a", "b", "c", "d"]
cursor.execute("INSERT INTO table VALUES ({})".format(",".join(u"%s", (v,) for v in values)))

>>>SyntaxError: Generator expression must be parenthesized if not sole argument

预期结果:

"INSERT INTO table VALUES (%s, %s, %s, %s)"

实现这一目标的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

语法错误是因为您调用",".join(...)的方式。它应如下所示:

cursor.execute("INSERT INTO table VALUES ({})".format(",".join("%s" for v in values)), values)

答案 1 :(得分:1)

我不确定您的期望是什么:

",".join(u"%s", (v,) for v in values)

但错误信息可以为您提供一些错误的线索:

  

SyntaxError:如果不是唯一参数

,则生成器表达式必须带括号

这里的“生成器表达式”部分为(v,) for v in values

你想要的东西显然是:

values = ["a", "b", "c", "d"]
placeholders = ", ".join("%s" for _ in values) 
sql = "INSERT INTO table VALUES ({})".format(placeholders)
cursor.execute(sql, values)

答案 2 :(得分:0)

您可以尝试使用临时占位符

<强>实施例

values = ["a", "b", "c", "d"]
placeholders = ', '.join('?' * len(values))
cursor.execute("INSERT INTO table VALUES ({0})".format(placeholders), tuple(values))