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

如何用Sequelize更新MySQL中JSON类型列的指定键?

只更新MySQL JSON列的特定键(Sequelize实现)

我太懂你这个困扰了!直接传{ "details": { name : "user" } }确实会把整个details字段覆盖掉,咱们得换个思路——利用MySQL原生的JSON_SET函数,配合Sequelize的literal方法来实现只更新指定键的需求。

基础实现方法

直接在更新语句里用Sequelize.literal调用JSON_SET,这样只会修改JSON里的目标键,不会影响其他内容:

const { Sequelize } = require('sequelize');

Profile.update(
  {
    // 使用JSON_SET指定要更新的JSON路径和值
    details: Sequelize.literal(`JSON_SET(details, '$.name', 'user')`)
  },
  { where: { id: id } }
)
.then(function(obj) {
  console.log("更新完成,受影响的行数:", obj[0]);
})
.catch(function(err) {
  console.error("更新出错:", err);
});

这里的JSON_SET语法很直观:JSON_SET(列名, '$.键路径', 新值),$.name就代表details这个JSON对象里的name键。

动态键/值的安全写法

如果要更新的键名或者值是动态生成的(比如来自用户输入),直接拼接字符串会有SQL注入风险,这时候可以用Sequelize的参数绑定功能:

const targetKey = "name";
const newValue = "user";

Profile.update(
  {
    details: Sequelize.literal(`JSON_SET(details, :path, :value)`)
  },
  {
    where: { id: id },
    bind: {
      path: `$.${targetKey}`, // 构造JSON路径
      value: newValue
    }
  }
)
.then(...)
.catch(...);

这种方式会自动处理参数转义,避免注入问题,更适合生产环境。

额外说明

  • 这个方法依赖MySQL 5.7+(因为JSON类型和JSON_SET函数是从这个版本开始支持的)
  • 如果你的Sequelize版本比较新(v6+),也可以用Sequelize.fn来封装JSON_SET,但literal的写法更直接易懂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:39:32