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

如何检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:00:01