如何从可变长度数组生成参数化SQL语句?
如何为可变长度数组构建参数化SQL INSERT语句?
嘿,这个问题我之前也碰到过,咱们一步步来解决它!
首先,你之前的代码报错是因为生成器表达式的写法不对,而且其实完全没必要用生成器来做这件事——我们只需要生成和数组长度一致的%s占位符就行,不用和具体的元素值绑定。
正确的实现方式
最简单高效的方法是利用列表乘法生成对应数量的%s,再用逗号连接:
values = ["a", "b", "c", "d"] # 生成和values长度相同的%s占位符,用逗号分隔 placeholders = ", ".join(["%s"] * len(values)) # 构建SQL语句并执行,注意把values作为第二个参数传入execute cursor.execute(f"INSERT INTO table VALUES ({placeholders})", values)
如果你不习惯用f-string,也可以用str.format():
cursor.execute("INSERT INTO table VALUES ({})".format(placeholders), values)
这样就能得到你想要的SQL语句:
INSERT INTO table VALUES (%s, %s, %s, %s)
为什么你的写法会报错?
你之前的代码里",".join(u"%s", (v,) for v in values)有两个问题:
join方法只接受一个参数(可迭代的字符串集合),但你传了两个参数(u"%s"和生成器),语法本身就错了;- 其实我们不需要遍历values的每个元素来生成
%s——不管元素是什么,我们只需要和数组长度匹配的占位符数量,所以用["%s"] * len(values)这种方式更直接。
重要提醒
一定要记得把values数组作为execute的第二个参数传入,而不是自己把值拼接到SQL语句里——这样数据库驱动会帮你处理参数化,避免SQL注入风险,这才是参数化查询的核心意义。
内容的提问来源于stack exchange,提问作者Below the Radar
相关产品推荐
相关产品推荐

