1、概念
模型是 Sequelize 的本质. 模型是代表数据库中表的抽象. 在 Sequelize 中,它是一个 Model 的扩展类。
该模型告诉 Sequelize 有关它代表的实体的几件事,例如数据库中表的名称以及它具有的列(及其数据类型)。
Sequelize 中的模型有一个名称。 此名称不必与它在数据库中表示的表的名称相同。通常,模型具有单数名称(例如:User),而表具有复数名称(例如,:Users),当然这是完全可配置的。
2、模型定义
在 Sequelize 中可以用两种等效的方式定义模型:
- 调用 sequelize.define(modelName,attributes,options)
- 扩展 Model 并调用 init(attributes,options)
3、使用 sequelize.define:
const { Sequelize, DataTypes } = require('sequelize')
const User = sequelize.define('User', {
id: {
type: DataTyps.INTEGER(10),
// 主键
primaryKey: true,
allowNull: false,
// 自动递增
autoIncrement: true
},
firstName: {
type: DataTypes.STRING(15),
// 是否允许为空
allowNull: false,
// 数据表中字段名称
field: 'first_name',
// 校验
validate: {
notNull: {
msg: 'Please enter your firstName'
}
}
},
lastName: {
type: DataTypes.STRING,
// 默认值
defaultValue: "John Doe"
},
timestamp: {
type: DataTypes.DATETIME,
defaultValue: Sequelize.NOW
},
{
// 其他模型参数
}
})
4、强制表名称等于模型名称
你可以使用 freezeTableName: true 参数停止 Sequelize 执行自动复数化. 这样,Sequelize 将推断表名称等于模型名称,而无需进行任何修改:
sequelize.define('User', {
// ...(属性)
}, {
freezeTableName: true
})
上面的示例将创建一个名为 User 的模型,该模型指向一个也名为 User 的表。
也可以为 sequelize 是咧全局定义此行为:
const sequelize = new Sequelize('[tableName]', ['username'], '[password]', {
define: {
freezeTableName: true
}
})
这样,所有表将使用与模型名称相同的名称.
5、直接提供表名
可以直接设置 sequelize 表名称
sequelize.define('User', {
// ... (属性)
}, {
tableName: 'Employees'
});
6、模型同步
定义模型时,sequelize 有关数据库中表的一些信息,但是,如果该表实际不存在与数据库中怎么办,如果存在,但具有不同的列,较少的列或任何其他差异,该怎么办?
这就是模型同步的来源,可通过 model.sync(options) sequelize 将自动对数据库实行 SQL 查询,仅查询数据库中的表,而不修改 JavaScript 端的模型。
- User.sync() 如果表不存在,则创建该表(已存在,则不执行任何操作)
- User.sync({ force: true }) 将创建表,如果表已存在,则将其首先删除
- User.sync({ alter: true }) 这将检查数据库中表的当前状态(如字段、数据类型等)然后在表中进行必要的更改以使其与模型匹配。
如:
await User.sync({ force: true })
一次同步所有模型
可以通过 sequelize.sync() 自动同步所有模型,如:
await sequelize.sync({ force: true })
7、删除表
删除与模型相关的表:
await User.drop()
删除所有表:
await sequelize.drop()
8、数据库安全检查
如上所示,sync 和 drop 的操作是具有破坏性的。Sequelize 使用 match 参数作为附加的安全检查,该检查将接受 RegExp:
// 当数据库名称以 '_test' 为结尾是,它才会运行 .sync()
sequelize.sync({ force: true, match: /_test$/})
9、时间戳
默认情况下,Sequelize 使用数据类型 DataTypes.DATE 自动向每个模型添加 createdAt 和 updatedAt 字段,当使用 Sequelize 创建或更新时,这些字段会自动设置。
对于带有 timestamp: false 参数的模型,可以禁止此行为:
sequelize.define('User', {
// ...(属性)
}, {
timestamp: false
})
也可以只启用 createdAt/ updatedAt 之一,并可自定义名称:
sequelize.define('User', {
// ...(属性)
}, {
// 启用时间戳
timestamp: true,
// 禁止 createdAt
createdAt: false,
// 使用 updatedAt 并修改字段mingcheng
updatedAt: 'updateTimestamp'
})
10、数据类型
模型中定义的字段都具有数据类型,Sequelize 提供很多内置数据类型,通过导入 DataTypes 使用:
const { DataTypes } = require('sequelize')
- 字符串
DataTypes.STRING // VARCHAR(255)
DataTypes.STRING(1234) // VARCHAR(1234)
DataTypes.STRING.BINARY // VARCHAR BINARY
DataTypes.TEXT // TEXT
DataTypes.TEXT('tiny') // TINYTEXT
- 布尔
DataTypes.BOOLEAN // TINYINT(1)
- 数字
DataTypes.INTEGER // INTEGER
DataTypes.BIGINT // BIGINT
DataTypes.BIGINT(11) // BIGINT(11)
DataTypes.FLOAT // FLOAT
DataTypes.FLOAT(11) // FLOAT(11)
DataTypes.FLOAT(11, 10) // FLOAT(11,10)
DataTypes.DOUBLE // DOUBLE
DataTypes.DOUBLE(11) // DOUBLE(11)
DataTypes.DOUBLE(11, 10) // DOUBLE(11,10)
DataTypes.DECIMAL // DECIMAL
DataTypes.DECIMAL(10, 2) // DECIMAL(10,2)
- 无符号和零填充整数 - 仅限于MySQL/MariaDB
在 MySQL 和 MariaDB 中,可以将数据类型INTEGER, BIGINT, FLOAT 和 DOUBLE 设置为无符号或零填充(或两者)
DataTypes.INTEGER.UNSIGNED
DataTypes.INTEGER.ZEROFILL
DataTypes.INTEGER.UNSIGNED.ZEROFILL
// 你还可以指定大小,即INTEGER(10)而不是简单的INTEGER
// 同样适用于 BIGINT, FLOAT 和 DOUBLE
- 日期
DataTypes.DATE // DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
DataTypes.DATE(6) // DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
DataTypes.DATEONLY // 不带时间的 DATE
- UUID
对于 UUID,使用 DataTypes.UUID. 对于 PostgreSQL 和 SQLite,它会是 UUID 数据类型;对于 MySQL,它则变成CHAR(36). Sequelize 可以自动为这些字段生成 UUID,只需使用 Sequelize.UUIDV1 或 Sequelize.UUIDV4 作为默认值即可:
{
type: DataTypes.UUID,
defaultValue: Sequelize.UUIDV4 // 或 Sequelize.UUIDV1
}