持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天
一、Sequelize模型
模型是 Sequelize 的本质. 模型是代表数据库中表的抽象. 在 Sequelize 中,它是一个Model的扩展类。该模型告诉 Sequelize 有关它代表的实体的几件事,例如数据库中表的名称以及它具有的列(及其数据类型)。
Sequelize 中的模型有一个名称, 此名称不必与它在数据库中表示的表的名称相同。 通常,模型具有单数名称(例如,User),而表具有复数名称(例如, Users),当然这是完全可配置的.
二、模型定义
在 Sequelize 中可以用两种等效的方式定义模型:
- 调用 sequelize.define
- 扩展 Model 并调用 init(attributes, options)
定义模型后,可通过其模型名称在 sequelize.models 中使用该模型.
为了学习一个示例,我们将考虑创建一个代表用户的模型,该模型具有一个 firstName 和一个 lastName. 我们希望将模型称为 User,并将其表示的表在数据库中称为 Users.
定义该模型的两种方法如下所示. 定义后,我们可以使用 sequelize.models.User 访问模型。使用 sequelize.define
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');
const User = sequelize.define('User', {
// 在这里定义模型属性
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
// allowNull 默认为 true
}
}, {
// 这是其他模型参数
});
// `sequelize.define` 会返回模型
console.log(User === sequelize.models.User); // true
三、 模型同步
定义模型时,你要告诉 Sequelize 有关数据库中表的一些信息. 但是,如果该表实际上不存在于数据库中怎么办? 如果存在,但具有不同的列,较少的列或任何其他差异,该怎么办?
这就是模型同步的来源.可以通过调用一个异步函数(返回一个Promise)model.sync(options). 通过此调用,Sequelize 将自动对数据库执行 SQL 查询. 请注意,这仅更改数据库中的表,而不更改 JavaScript 端的模型.
User.sync()- 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)User.sync({ force: true })- 将创建表,如果表已经存在,则将其首先删除User.sync({ alter: true })- 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配。
四、 时间戳
默认情况下,Sequelize 使用数据类型 DataTypes.DATE 自动向每个模型添加 createdAt 和 updatedAt 字段. 这些字段会自动进行管理 - 每当你使用Sequelize 创建或更新内容时,这些字段都会被自动设置. createdAt 字段将包含代表创建时刻的时间戳,而 updatedAt 字段将包含最新更新的时间戳.
注意: 这是在 Sequelize 级别完成的(即未使用 SQL触发器 完成). 这意味着直接 SQL 查询(例如,通过任何其他方式在不使用 Sequelize 的情况下执行的查询)将不会导致这些字段自动更新
烟火向星辰,所愿皆成真!