Sequelize 模型基础

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、数据库安全检查

如上所示,syncdrop 的操作是具有破坏性的。Sequelize 使用 match 参数作为附加的安全检查,该检查将接受 RegExp:

// 当数据库名称以 '_test' 为结尾是,它才会运行 .sync()
sequelize.sync({ force: true, match: /_test$/})

9、时间戳

默认情况下,Sequelize 使用数据类型 DataTypes.DATE 自动向每个模型添加 createdAtupdatedAt 字段,当使用 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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容