如何解决Prisma Upsert操作时的PrismaClientValidationError
Prisma Upsert操作出现PrismaClientValidationError的解决方法
问题场景
模型定义:
model Network { id Int @id @default(autoincrement()) name String chainId Int @map("chain_id") @@map("networks") }
执行upsert的代码:
const awaitables = networks.map(async (network) => { await prisma.network.upsert({ where: { name: network.name }, update: {}, create: network, }); });
收到的错误:
Unknown arg `name` in where.name for type NetworkWhereUniqueInput. Did you mean `id`? Available args: type NetworkWhereUniqueInput { id?: Int }
错误原因
Prisma的upsert方法要求where参数必须传入带有唯一约束的字段,当前模型中只有id字段通过@id自带了唯一约束,name字段没有设置唯一约束,因此不在NetworkWhereUniqueInput的可选参数范围内,导致验证失败。
解决方法
方案一:给name字段添加唯一约束(推荐)
修改Prisma模型,给name加上@unique注解:
model Network { id Int @id @default(autoincrement()) name String @unique // 添加唯一约束 chainId Int @map("chain_id") @@map("networks") }
修改后执行以下命令同步数据库并更新Prisma Client:
# 同步数据库结构(开发环境) npx prisma migrate dev # 重新生成Prisma Client npx prisma generate
完成后,原有的upsert代码即可正常运行,因为name现在是唯一约束字段,可以作为where条件用于upsert。
方案二:改用id作为查询条件(不推荐,无法通过name实现upsert)
如果不想给name加唯一约束,只能使用id作为where条件,但这样无法通过name判断是否需要创建新记录,仅适用于已知id的场景:
const awaitables = networks.map(async (network) => { await prisma.network.upsert({ where: { id: network.id }, // 改用id作为条件 update: {}, create: network, }); });
注意:方案二无法实现“根据name判断是否存在,不存在则创建”的upsert逻辑。
内容的提问来源于stack exchange,提问作者Seaworn
相关产品推荐
相关产品推荐

