使用Prisma的disconnect移除关联时类型检查失败求助
问题:断开Pet与Owner关联时的Prisma类型错误及解决方法
问题场景
用户定义的Prisma模型如下:
model Pet { id Int @id @default(autoincrement()) name String kind String owner Owner @relation(fields: [ownerId], references: [id]) ownerId Int } model Owner { id Int @id @default(autoincrement()) name String age Int pets Pet[] }
尝试用以下代码断开Pet与Owner的关联时,出现类型错误:
await prisma.pet.update({ where: { id: 1 }, data: { owner: { disconnect: true } } });
错误提示:
Type '{ disconnect: true; }' is not assignable to type 'OwnerUpdateOneRequiredWithoutPetsNestedInput'. Object literal may only specify known properties, but 'disconnect' does not exist in type 'OwnerUpdateOneRequiredWithoutPetsNestedInput'. Did you mean to write 'connect'?ts(2322)
用户尝试将owner或ownerId设为undefined,虽通过类型检查但未更新数据库。使用环境为SQLite、Prisma Studio,Prisma及客户端版本14.4,TypeScript版本5.0。
原因分析
核心问题在于Pet模型中的ownerId被定义为必填的Int类型,这意味着数据库中该字段不允许为null,Prisma因此不允许执行disconnect操作——因为断开关联会导致ownerId变为null,违反了字段的非空约束。同时,直接设undefined无效也是因为模型约束不允许该字段为空。
解决方法
1. 修改Prisma模型,允许关联可选
将Pet模型中的ownerId改为可选类型Int?,同时将owner关联也设为可选Owner?:
model Pet { id Int @id @default(autoincrement()) name String kind String owner Owner? @relation(fields: [ownerId], references: [id]) ownerId Int? } model Owner { id Int @id @default(autoincrement()) name String age Int pets Pet[] }
2. 重新生成Prisma客户端
执行命令更新客户端:
npx prisma generate
3. 执行断开关联操作
此时可以使用两种方式实现断开:
方式一:使用disconnect语法
await prisma.pet.update({ where: { id: 1 }, data: { owner: { disconnect: true } } });
方式二:直接设置ownerId为null
await prisma.pet.update({ where: { id: 1 }, data: { ownerId: null } });
两种方式都能正确断开Pet与Owner的关联,且符合类型检查要求。
内容的提问来源于stack exchange,提问作者Swen Mulderij
相关产品推荐
相关产品推荐

