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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:01:46