Sequelize——时间戳timestamps

本文详细介绍了Sequelize模型中时间戳的使用,包括如何开启与关闭createdAt和updatedAt字段,如何自定义时间戳字段名,以及如何处理时区差异。通过设置`timestamps`属性和指定`createdAt`、`updatedAt`字段,可以灵活管理模型的时间戳行为。此外,还展示了如何在Sequelize连接数据库时调整时区,确保时间与本地时间一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

默认情况下,Sequelize 使用数据类型 DataTypes.DATE 自动向每个模型添加 createdAt 和 updatedAt 字段。 这些字段会自动进行管理 - 每当你使用Sequelize 创建或更新内容时,这些字段都会被自动设置.。createdAt 字段将包含代表创建时刻的时间戳,而 updatedAt 字段将包含最新更新的时间戳。
注意:只有使用Sequelize本身的方法操作数据库时时间戳才会更新,使用其他插件的方法或者使用原生SQL操作时,时间戳不会更新。

二、开启与关闭

1.开启时间戳

在使用sequelize定义数据库表模型时,可以设置timestamps属性来开关时间戳,默认是开启状态
例如:

const Test = sequelize.define('test', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true
  },
  name: DataTypes.TEXT,
  age: DataTypes.INTEGER,
  address: DataTypes.TEXT,
  timestamp: { //我们自己定义的时间戳字段
    type: DataTypes.DATE,
    defaultValue: Date.now()
  }
}, {
  freezeTableName: true,
  timestamps: true// 在这里对sequelize自带时间戳开关进行设置,默认为true
})

我自己的数据库表结构:
在这里插入图片描述

当我们执行完插入数据操作时:

在这里插入图片描述
系统自动为我们生成了createdAt和updatedAt字段,但是时间和我们自己的时间戳差了8小时(因为我们是东八区时间)

2.关闭时间戳

const Test = sequelize.define('test', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true
  },
  name: DataTypes.TEXT,
  age: DataTypes.INTEGER,
  address: DataTypes.TEXT,
  timestamp: {
    type: DataTypes.DATE,
    defaultValue: Date.now()
  }
}, {
  freezeTableName: true,
  timestamps: false //时间戳关闭
})

再次插入数据:
在这里插入图片描述
createdAt和updatedAt字段值为null,时间戳已经被关闭

3.自定义关闭一个

如果我们想关闭createdAt和updatedAt其中一个时:

const Test = sequelize.define('test', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true
  },
  name: DataTypes.TEXT,
  age: DataTypes.INTEGER,
  address: DataTypes.TEXT,
  timestamp: {
    type: DataTypes.DATE,
    defaultValue: Date.now()
  }
}, {
  freezeTableName: true,
  timestamps: true, // 开启时间戳
  createdAt: false, // 关闭createdAt
  updatedAt: true // 开启updatedAt
})

插入一条数据:
在这里插入图片描述
createdAt值为null,updatedAt字段有数据,反之同理

二、自定义时间戳字段

我们修改一下表结构,增加一个createdTime字段:
在这里插入图片描述
然后将Sequelize的时间戳由createdAt改为createdTime

const Test = sequelize.define('test', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true
  },
  name: DataTypes.TEXT,
  age: DataTypes.INTEGER,
  address: DataTypes.TEXT,
  timestamp: {
    type: DataTypes.DATE,
    defaultValue: Date.now()
  }
}, {
  freezeTableName: true,
  timestamps: true,
  createdAt: "createdTime", // 将createdAt设为自定义字段createdTime
  updatedAt: true
})

插入一条数据:
在这里插入图片描述

三、时区设置

刚才上面我们说了,sequelize设置的时间戳和当前时间不一致,它总是慢8小时。
在这里插入图片描述

这是因为sequelize 存取时间是按照 UTC标准时间 ,而我们是处于东八区,所以要快8小时。其实我们知道这种现象的时候可以在取时间的时候加上8小时即可。
但是如果我们想让他存在数据库的时间就是当前正常时间的话可以在使用Sequelize连接数据库的时候对时区进行调整:

const sequelize = new Sequelize(config.database, config.username, config.password, {
  host: config.host,
  dialect: 'mysql',
  pool: {
    max: 5,
    min: 0,
    idle: 30000
  },
  timezone: '+08:00' // 慢几小时就加几小时,快则减
});

插入一条数据后:
在这里插入图片描述
时间与当前时间一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值