如何配置Sequelize在select/update操作时不返回时间戳字段
Sequelize 全局配置查询/更新不返回时间戳字段方案
核心需求是保留timestamps自动维护时间戳的能力,无需每次查询手动写exclude排除字段,可通过以下两种模型级/全局级配置实现:
方案1:单模型级配置(适用于指定模型单独生效)
在模型定义的options中配置defaultScope,设置默认查询排除三个时间戳字段即可:
// 模型定义示例 const Article = sequelize.define('Article', { title: DataTypes.STRING, content: DataTypes.TEXT // 其余业务字段 }, { timestamps: true, // 保留自动时间戳能力,无需关闭 paranoid: true, // 若使用软删除开启即可,不影响配置效果 // 默认作用域:所有常规查询自动排除指定字段 defaultScope: { attributes: { exclude: ['createdAt', 'updatedAt', 'deletedAt'] } } })
配置生效后,该模型下的findAll、findOne、findByPk、update等常规操作,默认查询结果都不会返回三个时间戳字段,无需每次查询单独配置排除规则。
如果遇到特殊场景需要临时获取时间戳字段,直接调用unscoped()取消默认作用域即可:
// 临时查询返回全字段(包含时间戳) const article = await Article.unscoped().findByPk(1)
也可以自定义专用作用域按需调用:
// 模型内新增自定义作用域 scopes: { withTimestamps: { attributes: { exclude: [] } } } // 调用时指定作用域 const article = await Article.scope('withTimestamps').findOne({where: {id: 1}})
方案2:全局实例配置(适用于所有模型统一生效)
如果项目中绝大多数模型都需要隐藏时间戳字段,可以在初始化Sequelize实例时,通过define配置项给所有模型设置默认规则,无需每个模型重复编写:
const sequelize = new Sequelize('db_name', 'db_user', 'db_password', { dialect: 'mysql', host: 'localhost', // 全局模型默认配置 define: { timestamps: true, paranoid: true, defaultScope: { attributes: { exclude: ['createdAt', 'updatedAt', 'deletedAt'] } } } })
该配置对初始化后通过sequelize.define定义的所有模型生效,个别需要返回时间戳的模型,可在自身模型配置中重写defaultScope覆盖全局规则,或使用unscoped()临时绕过配置。
注意:以上配置仅控制查询返回的字段范围,不会影响Sequelize内置的时间戳自动维护逻辑:数据新增、更新、软删除时时间字段的写入/刷新逻辑完全正常运行。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

