如何用Prisma $executeRaw实现PostgreSQL批量Upsert?
在Prisma中使用$executeRaw实现PostgreSQL批量Upsert
直接给你能运行的解决方案,核心是用Prisma.sql生成单个行的SQL片段,再通过Prisma.join把这些片段拼接成批量VALUES列表,具体代码如下:
async function batchUpsertPosts(posts) { // 遍历posts数组,为每条数据生成VALUES里的单行SQL片段 const rowValues = posts.map(post => Prisma.sql`(${post.feedDomain}, ${post.postId}, ${post.title}, ${post.score})` ); await prisma.$executeRaw` INSERT INTO "Posts" ( "feedDomain", "postId", "title", "score" ) VALUES ${Prisma.join(rowValues)} ON CONFLICT ("feedDomain", "postId") DO UPDATE SET "score" = EXCLUDED."score" `; }
关键细节说明:
- SQL注入防护:用
Prisma.sql包裹参数会自动处理转义,避免注入风险,绝对不要手动拼接字符串 - 字段/表名的引号:PostgreSQL中驼峰命名的表和字段必须用双引号包裹,否则会被自动转成小写导致找不到对应对象
- Prisma.join的作用:把所有单行片段用逗号分隔,生成
(val1,val2),(val3,val4)...的格式,完美适配VALUES语法 - EXCLUDED关键字:PostgreSQL内置变量,代表冲突发生时原本要插入的那条数据,用来取新值覆盖旧数据
如果需要更新多个字段,比如同时更新title,只需要修改DO UPDATE部分:
DO UPDATE SET "score" = EXCLUDED."score", "title" = EXCLUDED."title"
内容的提问来源于stack exchange,提问作者Redark
相关产品推荐
相关产品推荐

