如何通过Sequelize向MySQL的JSON类型数组字段添加元素?
解决Sequelize向MySQL JSON数组字段添加元素的问题
问题原因
- 直接修改
dataValues中的数组:Sequelize的变更追踪机制不会识别这种修改,执行save()时不会同步到数据库。 - 错误赋值字段:你第二个
update代码里误将字符串类型的category_name赋值给数组字段,导致字段被改成字符串。
正确解决方案
方法一:修改实例属性后保存
直接操作模型实例的属性(而非dataValues),让Sequelize检测到字段变化:
// 确保数组存在(若模型已设默认值为[],查询出的实例会自带该数组) if (!category.array_Of_food) { category.array_Of_food = []; } category.array_Of_food.push('item1'); await category.save();
方法二:使用Sequelize操作符直接更新(推荐)
无需先查询实例,直接在数据库层面追加元素,效率更高:
- 适配多数Sequelize版本的写法(用MySQL原生函数):
await Category.update( { array_Of_food: Sequelize.fn('JSON_ARRAY_APPEND', Sequelize.col('array_Of_food'), '$', 'item1') }, { where: { id: categoryId } } // 替换为你的查询条件 );
- Sequelize v5+ 简洁写法:
await Category.update( { array_Of_food: { [Sequelize.Op.push]: 'item1' } }, { where: { id: categoryId } } // 替换为你的查询条件 );
模型定义校验
确保你的模型中该字段正确配置为JSON类型并设置默认值:
array_Of_food: { type: DataTypes.JSON, defaultValue: [], allowNull: false }
内容的提问来源于stack exchange,提问作者kingsJayson
相关产品推荐
相关产品推荐

