根据这个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)"
实现这一目标的正确方法是什么?
答案 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))