一、简介
默认情况下,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' // 慢几小时就加几小时,快则减
});
插入一条数据后:
时间与当前时间一致