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
相关产品推荐
相关产品推荐

