Sequelize中更新findOne返回对象的方法及updatedAt问题排查
Sequelize 更新字段与updatedAt时间戳问题解决方案
一、解决update操作无效果的问题
你的update代码没生效,主要是两个原因:
- 未等待异步操作完成:
update是异步方法,必须添加await确保执行完成 empObj字段名与模型定义不匹配,或字段值与现有数据完全一致(Sequelize默认跳过无变化字段的更新)
修正后的代码:
// 确保字段名和模型定义一致,比如指定designation const empObj = { designation: '新职位名称' }; // 添加await等待异步更新完成 await existingEmployee.update(empObj);
二、仅更新updatedAt时间戳的两种方法
方法1:使用实例的touch()方法
Sequelize内置了touch()方法,专门用于更新实例的updatedAt字段:
await existingEmployee.touch();
方法2:强制更新指定字段
如果需要手动控制时间戳值,可直接更新updatedAt字段:
// 手动设置当前时间 await existingEmployee.update({ updatedAt: new Date() }); // 或者强制触发时间戳更新(无需指定具体值) await existingEmployee.update( {}, { fields: ['updatedAt'] } );
三、为什么updatedAt不会自动更新?
你只在模型中配置了defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),这个配置仅在创建新对象时生效。要让updatedAt在更新操作时自动刷新,需在模型字段定义中添加onUpdate属性:
updatedAt: { type: Sequelize.DATE, defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'), onUpdate: Sequelize.literal('CURRENT_TIMESTAMP') // 关键配置:更新时自动刷新 }
配置后,每次执行update操作(即使字段值无变化),只要触发数据库更新,updatedAt就会自动更新。如果需要强制更新(即使字段无变化),可在update时添加force: true参数:
await existingEmployee.update(empObj, { force: true });
内容的提问来源于stack exchange,提问作者user275157
相关产品推荐
相关产品推荐

