什么是模型

模型的概念

文档上的说明
模型是 Sequelize 的本质. 模型是代表数据库中表的抽象. 在 Sequelize 中,它是一个 Model 的扩展类.
该模型告诉 Sequelize 有关它代表的实体的几件事,例如数据库中表的名称以及它具有的列(及其数据类型).
Sequelize 中的模型有一个名称. 此名称不必与它在数据库中表示的表的名称相同. 通常,模型具有单数名称(例如,User),而表具有复数名称(例如, Users),当然这是完全可配置的.
说白就是将数据中表抽象化,就是通过模型来描述你这表示啥样子的

解决啦什么问题

之前我们使用mysql2的驱动程序发现它对数据库的操作很繁琐,而且新建表也很繁琐, 使用Sequelize 中的模型,可以通过抽象得方法(说白啦就是通过配置的方式)来创建表,你在数据干的事Sequelize 都可以让你很容易办到,你告诉我Sequelize 的模型我需要一个什么样子的表,它会自己去给你创建

模型定义

在 Sequelize 中可以用两种等效的方式定义模型:

定义模型后,可通过其模型名称在 sequelize.models 中使用该模型.
为了学习一个示例,我们将考虑创建一个代表用户的模型,该模型具有一个 firstName 和一个 lastName. 我们希望将模型称为 User,并将其表示的表在数据库中称为 Users.
定义该模型的两种方法如下所示. 定义后,我们可以使用 sequelize.models.User 访问模型.

使用

中文文档上的例子

  1. // 导入内置数据类型
  2. const { DataTypes } = require('sequelize');
  3. // 实例化 也就是需要连接的数据库
  4. const sequelize = new Sequelize('sqlite::memory:');
  5. const User = sequelize.define('User', {
  6. // 在这里定义模型属性
  7. // 也就是描述列
  8. firstName: {
  9. type: DataTypes.STRING,
  10. allowNull: false // 是否允许为null值
  11. },
  12. lastName: {
  13. type: DataTypes.STRING
  14. // allowNull 默认为 true
  15. }
  16. }, {
  17. // 这是其他模型参数
  18. });
  19. // `sequelize.define` 会返回模型
  20. console.log(User === sequelize.models.User); // true

我的例子

  1. const sequelize = require('./connectDB');// 我在另个文件实例啦sequelize
  2. const { DataTypes } = require('sequelize');
  3. const User = sequelize.define(
  4. 'User',
  5. {
  6. // 在这里定义模型属性
  7. firstName: {
  8. type: DataTypes.STRING,
  9. allowNull: false,
  10. },
  11. lastName: {
  12. type: DataTypes.STRING,
  13. // allowNull 默认为 true
  14. },
  15. },
  16. {
  17. // 这是其他模型参数
  18. createdAt: false, // 创建时间 默认开启
  19. updatedAt: false, // 修改时间 默认开启
  20. paranoid: true,//从此以后,该表的数据不会真正的删除,而是增加一列deletedAt,记录删除的时间
  21. }
  22. );
  23. module.exports = User

表名

请注意,在以上两种方法中,都从未明确定义表名(Users). 但是,给出了模型名称(User).
默认情况下,当未提供表名时,Sequelize 会自动将模型名复数并将其用作表名. 这种复数是通过称为 inflection 的库在后台完成的,因此可以正确计算不规则的复数(例如 person -> people).
当然,此行为很容易配置.

让模型名称等于表名

你可以使用 freezeTableName: true 参数停止 Sequelize 执行自动复数化. 这样,Sequelize 将推断表名称等于模型名称,而无需进行任何修改:

  1. sequelize.define('User', {
  2. // ... (属性)
  3. }, {
  4. freezeTableName: true
  5. });

自定义表名

  1. sequelize.define('User', {
  2. // ... (属性)
  3. }, {
  4. tableName: 'Employees' //表名
  5. });

DataTypes 是啥

是数据模型也就是数据库每一列的数据格式
你在模型中定义的每一列都必须具有数据类型. Sequelize 提供很多内置数据类型. 要访问内置数据类型,必须导入 DataTypes

  1. const { DataTypes } = require("sequelize"); // 导入内置数据类型

字符串

  1. DataTypes.STRING // VARCHAR(255)
  2. DataTypes.STRING(1234) // VARCHAR(1234)
  3. DataTypes.STRING.BINARY // VARCHAR BINARY
  4. DataTypes.TEXT // TEXT
  5. DataTypes.TEXT('tiny') // TINYTEXT
  6. DataTypes.CITEXT // CITEXT 仅 PostgreSQL 和 SQLite.
  7. DataTypes.TSVECTOR // TSVECTOR 仅 PostgreSQL.

布尔值

  1. DataTypes.BOOLEAN // TINYINT(1)

数字

  1. DataTypes.INTEGER // INTEGER
  2. DataTypes.BIGINT // BIGINT
  3. DataTypes.BIGINT(11) // BIGINT(11)
  4. DataTypes.FLOAT // FLOAT
  5. DataTypes.FLOAT(11) // FLOAT(11)
  6. DataTypes.FLOAT(11, 10) // FLOAT(11,10)
  7. DataTypes.REAL // REAL 仅 PostgreSQL.
  8. DataTypes.REAL(11) // REAL(11) 仅 PostgreSQL.
  9. DataTypes.REAL(11, 12) // REAL(11,12) 仅 PostgreSQL.
  10. DataTypes.DOUBLE // DOUBLE
  11. DataTypes.DOUBLE(11) // DOUBLE(11)
  12. DataTypes.DOUBLE(11, 10) // DOUBLE(11,10)
  13. DataTypes.DECIMAL // DECIMAL
  14. DataTypes.DECIMAL(10, 2) // DECIMAL(10,2)

无符号和零填充整数 - 仅限于MySQL/MariaDB

在 MySQL 和 MariaDB 中,可以将数据类型INTEGER, BIGINT, FLOATDOUBLE 设置为无符号或零填充(或两者),如下所示:

  1. DataTypes.INTEGER.UNSIGNED
  2. DataTypes.INTEGER.ZEROFILL
  3. DataTypes.INTEGER.UNSIGNED.ZEROFILL
  4. // 你还可以指定大小,即INTEGER(10)而不是简单的INTEGER
  5. // 同样适用于 BIGINT, FLOAT 和 DOUBL

日期

  1. DataTypes.DATE // DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
  2. DataTypes.DATE(6) // DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
  3. DataTypes.DATEONLY // 不带时间的 DATE

UUID

对于 UUID,使用 DataTypes.UUID. 对于 PostgreSQL 和 SQLite,它会是 UUID 数据类型;对于 MySQL,它则变成CHAR(36). Sequelize 可以自动为这些字段生成 UUID,只需使用 Sequelize.UUIDV1Sequelize.UUIDV4 作为默认值即可:

  1. {
  2. type: DataTypes.UUID,
  3. defaultValue: Sequelize.UUIDV4 // 或 Sequelize.UUIDV1
  4. }

文档:https://github.com/demopark/sequelize-docs-Zh-CN/blob/master/core-concepts/model-basics.md

模型的同步

如何让模型与数据库进行同步,但是同步会有几种情况,数据库没有这个表,数据中的表与模型中的不一致,可能多几列或者少几列
这就是模型同步的来源.可以通过调用一个异步函数(返回一个Promise)model.sync(options). 通过此调用,Sequelize 将自动对数据库执行 SQL 查询. 请注意,这仅更改数据库中的表,而不更改 JavaScript 端的模型.

  • User.sync() - 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)
  • User.sync({ force: true }) - 将创建表,如果表已经存在,则将其首先删除
  • User.sync({ alter: true }) - 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配.

    示例: 同步单个模型

    1. await User.sync({ force: true });
    2. console.log("用户模型表刚刚(重新)创建!");

    一次同步所有模型

    你可以使用 sequelize.sync() 自动同步所有模型. 示例:
    1. await sequelize.sync({ force: true });
    2. console.log("所有模型均已成功同步.");

    时间戳

    默认情况下,Sequelize 使用数据类型 DataTypes.DATE 自动向每个模型添加 createdAtupdatedAt 字段. 这些字段会自动进行管理 - 每当你使用Sequelize 创建或更新内容时,这些字段都会被自动设置. createdAt 字段将包含代表创建时刻的时间戳,而 updatedAt 字段将包含最新更新的时间戳.
    注意: 这是在 Sequelize 级别完成的(即未使用 SQL触发器 完成). 这意味着直接 SQL 查询(例如,通过任何其他方式在不使用 Sequelize 的情况下执行的查询)将不会导致这些字段自动更新.
    对于带有 timestamps: false 参数的模型,可以禁用此行为:
    image.png
    也就是图中的这两列
    关闭方法看上面我的示例