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

Prisma JSON字段Upsert时null值报错问题求助

正确处理Prisma JSON字段的Null值插入与更新

核心问题解析

你遇到的报错源于对Prisma中两种"空值"的混淆:

  • SQL层面的NULL:数据库字段本身无值,对应Schema定义的Json?(可选字段)
  • JSON类型的null:数据库字段存储的JSON值为null,需用Prisma.JsonNull标识

以下是针对不同场景的解决方案:


场景1:设置字段为SQL层面的NULL

直接传递null即可,需显式判断值类型避免触发Prisma校验:

await prisma.website.upsert({
  where: { id: 1 }, // 替换为你的实际查询条件
  update: {
    myField: data.myField === null ? null : data.myField
  },
  create: {
    id: 1, // 替换为你的必填字段
    myField: data.myField === null ? null : (data.myField ?? {})
  }
});
  • 逻辑说明:
    • 当data.myField为null时,主动设置为SQL NULL
    • 当data.myField为undefined时,create阶段用默认值{},update阶段不修改字段

场景2:设置字段为JSON类型的null(存储JSON值null)

使用Prisma.JsonNull显式标识,避免用||这类模糊逻辑(会误判空对象/空数组等假值):

import { Prisma } from '@prisma/client';

await prisma.website.upsert({
  where: { id: 1 },
  update: {
    myField: data.myField === null ? Prisma.JsonNull : data.myField
  },
  create: {
    id: 1,
    myField: data.myField === null ? Prisma.JsonNull : (data.myField ?? {})
  }
});
  • 注意:确保你的Prisma版本≥v3.0,该版本开始支持Prisma.JsonNull特殊标识

场景3:保留默认值/不修改字段

  • Create阶段:若data.myField为undefined,直接省略该字段或用data.myField ?? {},Prisma会自动使用默认值{}
  • Update阶段:若data.myField为undefined,不要在update对象中包含该字段,Prisma不会修改现有值;若需强制重置为默认值,直接传递{}

之前写法的错误原因

你使用data.myField || Prisma.JsonNull时,null会触发||返回Prisma.JsonNull这个特殊对象,但如果代码中存在序列化中间件,或Prisma客户端未正确识别该对象,就会出现[object Object]无法序列化的错误。显式判断null值是更安全的写法。

内容的提问来源于stack exchange,提问作者funerr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:45:26