You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:12:39