如何检查Sequelize.js模型实例的更新操作是否已成功保存?
Sequelize 实例保存状态检查方案
Sequelize 6.5 版本没有内置和 Ruby ORM 中model.saved()完全对应的原生方法,但可以通过框架自带的属性和方法实现同等检测效果,也可以自行封装同名方法直接使用。
核心内置判断依据
instance.changed():实例方法,返回所有发生修改但未同步到数据库的字段数组,返回空数组时代表当前实例属性和数据库存储完全一致。instance.isNewRecord:实例属性,值为true时代表该实例是未执行过首次保存的新实例,保存成功后会自动变为false。
直接使用原生能力的代码示例
let art = await Artwork.findByPk(req.body.id); if (!art) return false; // 对art实例执行更新操作 art.name = "a new name"; art.description = "a new description"; // 检查是否所有修改都已保存 if (!art.isNewRecord && art.changed().length === 0) { // 实例已完成所有保存,执行对应操作 } else { // 实例存在未保存修改/是未保存的新实例,执行其他操作 await art.save(); }
封装saved()方法的实现方案
你可以在模型定义阶段直接添加实例方法,后续就可以直接调用art.saved()使用:
const { Model, DataTypes } = require('sequelize'); class Artwork extends Model {} Artwork.init({ // 模型字段定义省略 name: DataTypes.STRING, description: DataTypes.TEXT }, { sequelize, modelName: 'Artwork' }); // 自定义saved实例方法 Artwork.prototype.saved = function() { return !this.isNewRecord && this.changed().length === 0; };
封装完成后即可直接使用你示例中的写法:
if (art.saved()) { // 执行对应操作 } else { // 未保存逻辑 }
补充说明
await instance.save()方法执行时如果保存失败(比如字段校验不通过、数据库报错)会直接抛出异常,建议配合try...catch使用,判断保存操作是否执行成功。
内容的提问来源于stack exchange,提问作者user938363
相关产品推荐
相关产品推荐

