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

