Sequelize中能否对同一个实例连续两次调用save()方法?
Sequelize同一模型实例多次调用save()的问题说明
首先给出明确结论:对同一个查询得到的Sequelize模型实例连续多次调用save()是完全支持的,功能本身不存在问题。
你给出的示例代码可以运行,但存在一个不规范的写法:第二个save()调用没有加await,这是异步操作的常见疏漏,和save()能否连续调用无关。
原理说明
- Sequelize的模型实例会自动跟踪字段的修改状态,被修改但还未同步到数据库的字段会被标记为「脏字段」。
- 每次调用
save()时,Sequelize只会把当前的脏字段组装为UPDATE语句提交到数据库,提交完成后会清空本次的脏字段标记,实例状态和数据库保持同步。 - 第一次
save()执行完成后,你再次修改实例的name属性,该属性会被标记为新的脏字段,第二次调用save()就只会提交name的修改,不会影响之前已经同步的color字段。
修正后的正确写法
只要给第二个save()也加上await等待异步操作完成,代码就能完全按照预期运行:
const car = await Cars.findOne({ where: { id: 1} }); car.color = 'red'; await car.save(); // 仅提交color的修改 // 中间业务逻辑 car.name = 'my car name'; await car.save(); // 仅提交name的修改
如果不写await,你将无法捕获第二次save()可能抛出的异常,同时后续逻辑如果依赖name已入库的状态,可能会出现时序错误。
内容的提问来源于stack exchange,提问作者Gamaliel Castro
相关产品推荐
相关产品推荐

