Sequelize搭配MySQL如何实现数组字段的元素增删操作
1 数组追加写法的正确性说明
你的现有写法存在两处前置错误,修正后追加逻辑可正常运行:
- 模型字段定义错误
你当前将names字段类型设置为Sequelize.STRING,该类型仅支持存储字符串,无法存储数组。若你使用的是PostgreSQL(Sequelize仅对PostgreSQL适配了原生数组类型),需将字段类型改为Sequelize.ARRAY(Sequelize.STRING);另外Sequelize中设置默认值的字段名是defaultValue,你写的default: []不会生效。
修正后的字段定义参考:names:{ type: Sequelize.ARRAY(Sequelize.STRING), // 你自定义的get、set逻辑和Sequelize默认逻辑完全一致,可以直接删除冗余代码 defaultValue: [] } - 更新语句结构错误
Sequelize的update方法参数顺序为「更新字段对象、查询配置对象」,你当前把where条件和更新字段混写了。修正结构后,你用array_append追加元素的逻辑是正确的,完整代码如下:
如果你用的是MySQL等不支持原生数组类型的数据库,上述SQL函数写法完全不可用,需将字段改为JSON/TEXT类型,存储序列化后的数组,查询到实例后在内存中操作数组再保存。await Model.update( { names: Sequelize.fn( "array_append", Sequelize.col("names"), userName ) }, { where: { id: req.body.id } } )
2 数组指定元素删除实现
array_append是PostgreSQL的原生数组函数,对应的反向删除函数为array_remove,作用是移除数组中所有和传入值相等的元素,调用方式和array_append一致,参考代码:
await Model.update( { names: Sequelize.fn( "array_remove", Sequelize.col("names"), userName // 传入需要删除的目标元素值 ) }, { where: { id: req.body.id } } )
如果需要按数组下标删除元素,不建议用SQL函数拼接,优先查询出对应记录后在JS层操作数组,再调用实例的save方法保存,兼容性更强,也能避免不同数据库的语法差异问题。
内容的提问来源于stack exchange,提问作者Sibou
相关产品推荐
相关产品推荐

