Prisma中update/upsert无法用user_id查询的类型问题解决
解决Prisma中update/upsert时无法用user_id作为where条件的类型错误
问题根源
Prisma的update、upsert方法要求where参数必须传入唯一标识字段,对应自动生成的sessionsWhereUniqueInput类型。当前你的模型只有id被纳入这个唯一标识类型,所以user_id无法作为where条件传入,触发类型错误。
解决方法
根据你的业务场景选择以下方案:
1. 给user_id添加唯一约束(推荐单session用户场景)
如果业务要求每个用户最多对应一个session,直接在Prisma Schema中给user_id添加@unique约束:
model sessions { id BigInt @id @default(autoincrement()) hash String user_id BigInt @unique // 添加唯一约束 }
执行npx prisma generate重新生成类型定义后,sessionsWhereUniqueInput会自动包含user_id,此时就能直接在update/upsert的where中使用user_id:
await prisma.sessions.upsert({ where: { user_id: id }, update: { hash }, create: { hash, user_id: id }, });
2. 使用updateMany替代update(多session用户场景)
如果一个用户可以对应多个session,不需要user_id唯一,改用updateMany方法——它的where参数支持普通筛选条件,不需要唯一键:
await prisma.sessions.updateMany({ where: { user_id: id }, data: { hash }, });
注意:updateMany会更新所有匹配user_id的session,返回值是更新的记录条数,而非单条session对象。
3. 先查询再更新(精准更新单条多session记录)
如果要更新用户的某一条特定session,又不想给user_id加唯一约束,可以先通过findFirst定位记录,再用id更新:
const targetSession = await prisma.sessions.findFirst({ where: { user_id: id, // 可添加额外筛选条件定位具体session,比如创建时间等 }, }); if (targetSession) { await prisma.sessions.update({ where: { id: targetSession.id }, data: { hash }, }); }
关于是否需要将user_id设为唯一主键
不需要强制设为主键:
- 只需给
user_id添加@unique唯一约束,就能让它成为where的唯一标识字段,同时保留id作为自增主键,这也是更常见的数据库设计方案。 - 若业务上
user_id本身就能唯一标识session(比如单session机制),也可以将user_id设为主键,但这种场景下id字段可以省略。
内容的提问来源于stack exchange,提问作者reactor
相关产品推荐
相关产品推荐

