Express.js中Prisma $queryRaw的WHERE IN传入UUID失效问题
解决Prisma $queryRaw中WHERE IN子句传入UUID数组的问题
问题根源
你手动拼接UUID字符串并错误调用uuid()函数的方式存在问题:
- 手动拼接SQL会引发SQL注入风险,且Prisma的模板字符串插值无法正确识别这种拼接后的参数
- 没必要手动给UUID值加单引号,
uuid()函数的用法也不符合Prisma参数绑定规范
正确实现方式
方法1:用Prisma.sql和Prisma.join(推荐)
借助Prisma提供的工具函数安全处理数组参数,自动完成UUID类型转换:
const { Prisma } = require('@prisma/client'); const ids = ['r45545-2a554-458c-a94f-3ccd2f82582b','4fdgdgfdg-2f1b-4af5-81c8-3a29494a45f9']; const datas = await prisma.$queryRaw` SELECT * FROM public."myTable" WHERE "id" IN (${Prisma.join(ids)}) `;
方法2:直接绑定数组参数
Prisma 4.x及以上版本支持直接将数组作为参数传入,自动处理语法和类型:
const ids = ['r45545-2a554-458c-a94f-3ccd2f82582b','4fdgdgfdg-2f1b-4af5-81c8-3a29494a45f9']; const datas = await prisma.$queryRaw` SELECT * FROM public."myTable" WHERE "id" IN (${ids}) `;
关键注意事项
- 绝对禁止手动拼接SQL字符串,必须用Prisma参数绑定机制,防止SQL注入
- Prisma会自动识别UUID类型,无需手动调用
uuid()或添加单引号 - PostgreSQL中带大小写的表名/字段名必须用双引号包裹,保持代码中的写法一致
内容的提问来源于stack exchange,提问作者Esfak
相关产品推荐
相关产品推荐

