如何在Prisma中实现对应SQL的upsert冲突更新查询
Prisma 实现对应SQL逻辑的Upsert写法
前置配置
首先需要在Prisma Schema中为user_conference表配置user_id、conference_id的联合唯一约束,否则Prisma无法识别冲突判定键,参考Schema定义:
model UserConference { userId Int @map("user_id") conferenceId String @map("conference_id") points Int activitiesCompleted String[] @map("activities_completed") // 对应SQL中的联合唯一冲突键 @@unique([userId, conferenceId]) @@map("user_conference") }
实现代码
直接使用Prisma客户端提供的upsert方法,搭配原子操作符即可完全复现给出的SQL逻辑:
const record = await prisma.userConference.upsert({ where: { // 联合唯一键的查询条件,键名默认为「字段1_字段2」格式,如果给@@unique设置了自定义name则替换为自定义名称 userId_conferenceId: { userId: 1, conferenceId: '3a4QQI0KbO0eaDjzhIgeeZ' } }, // 记录不存在时执行插入逻辑 create: { userId: 1, conferenceId: '3a4QQI0KbO0eaDjzhIgeeZ', points: 40, activitiesCompleted: ['4vwp3L1EJYQ9rI1Pv7er2'] }, // 命中唯一键冲突时执行更新逻辑 update: { points: { increment: 40 // 原子累加:在原有points值基础上加40 }, activitiesCompleted: { push: '4vwp3L1EJYQ9rI1Pv7c4x0' // 原子追加:向数组尾部添加指定活动ID } } })
注意事项
- 上述写法用到的
increment、push是Prisma的原子操作符,执行过程不存在并发下的读写竞态,和提供的原生SQL执行效果完全一致。 - 该写法默认适配PostgreSQL,和示例SQL里的数组类型、数组拼接语法对应。如果使用不支持原生数组的数据库(比如MySQL),需要先把字段类型调整为Json类型,再对应调整数组操作逻辑。
内容的提问来源于stack exchange,提问作者jgatjens
相关产品推荐
相关产品推荐

