使用Drizzle向PostgreSQL原生SQL传数组时出现多余引号问题
在Drizzle中向PostgreSQL传递数组变量的正确方式
你之前的写法错误在于手动拼接字符串或硬编码引号,导致Drizzle将整个拼接结果视为单个参数,从而出现多余引号。以下是两种正确的实现方式:
方式1:直接传递JS数组到sql模板字符串
const arr = ['value 1', 'value 4']; const result = await db.execute(sql` SELECT * FROM value_table WHERE ARRAY[${arr}] && array_values `);
Drizzle会自动识别数组类型,将其转换为PostgreSQL的数组语法,最终生成的SQL和参数如下:
SELECT * FROM value_table WHERE ARRAY ['value 1','value 4'] && array_values
params: ['value 1','value 4']
方式2:使用Drizzle的sql.array方法
const arr = ['value 1', 'value 4']; const result = await db.execute(sql` SELECT * FROM value_table WHERE ${sql.array(arr)} && array_values `);
这种方式更显式,Drizzle同样会正确处理数组的参数绑定,生成符合预期的SQL语句和参数列表。
错误写法的问题解析
- 第一种错误写法中,你将数组转成了逗号分隔的字符串
'value 1,value 4',Drizzle会把这个字符串当作单个参数,因此添加外层引号,导致数组仅包含一个元素。 - 第二种错误写法手动给每个元素添加了引号,拼接后Drizzle仍会将整个拼接结果视为单个参数,进而添加外层引号,最终参数里出现多余的嵌套引号。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

