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

如何用Prisma直接更新含旧数据的JSON字段(无需先查询)

直接更新Prisma中JSON字段的解决方案

可以通过单条命令直接更新JSON字段,无需先查询,但你之前的写法有误——Prisma 4.10.1的客户端API不会将merge这类关键字解析为JSON更新操作,而是会把整个对象当作普通JSON值存入,导致出现merge键的异常结果。

针对MySQL 8.0.3,正确的做法是使用Prisma原生SQL查询,借助MySQL内置的JSON函数来完成更新:

方案1:合并JSON字段(保留原有键,覆盖/新增指定键)

使用JSON_MERGE_PATCH函数,它会合并现有JSON与新的JSON对象,已存在的键会被覆盖,不存在的键会被添加:

await prisma.$executeRaw`
  UPDATE thetable 
  SET theJsonField = JSON_MERGE_PATCH(theJsonField, ${JSON.stringify({ amount: 26 })}),
      otherIntField = otherIntField - 7
  WHERE user_id = ${id};
`

方案2:精确更新JSON字段的某个路径

如果只需更新JSON中的特定键(比如深层嵌套的键),可以用JSON_SET函数:

await prisma.$executeRaw`
  UPDATE thetable 
  SET theJsonField = JSON_SET(theJsonField, '$.amount', 26),
      otherIntField = otherIntField - 7
  WHERE user_id = ${id};
`

这里的'$.amount'是JSON路径语法,指向要更新的键。

为什么之前的写法失效?

Prisma 4.x早期版本(包括4.10.1)的客户端API不支持直接通过data中的嵌套操作符(如merge)来更新JSON字段,这类嵌套对象会被直接当作JSON值存入数据库,因此才会出现{"merge": {"amount":26}}的异常结果。如果后续升级到Prisma 5.x及以上版本,可使用官方新增的JSON更新操作符,但在当前版本下,原生SQL是最可靠的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:06:33