在 Sequelize 中如何定义模型

阅读时长 9 分钟读完

前言

Sequelize 是 Node.js 环境下的 ORM 框架。它提供了对关系型数据库的访问,使得开发者可以使用 JavaScript 的语法来操作数据库,而不需要手动编写 SQL 语句。本文将介绍如何在 Sequelize 中定义模型。

模型结构

在 Sequelize 中,模型是指一个数据库表的抽象。它包含了表的结构、约束和关系。定义一个模型时,需要指定它对应的数据库表名、各个字段的名称和类型、以及与其他模型之间的关系。

下面是一个例子,定义了一个名为 User 的模型:

-- -------------------- ---- -------
----- - ---------- ----- - - ---------------------

----- ---- ------- ----- --
-----------
  --- -
    ----- ------------------
    ----------- -----
    -------------- -----
  --
  ----- -----------------
  ---- ------------------
-- - ---------- ---------- ------ ---
展开代码

这个模型对应的是一个名为 user 的数据库表,包含三个字段:idnameage。其中 id 是主键,自增类型为整数,nameage 的类型分别为字符串和整数。可以看出,模型定义的关键在于调用 init 方法,并传入模型的结构。在上面的例子中,我们还指定了模型的名称为 User

字段类型

在模型定义中,需要为每个字段指定它的类型。Sequelize 支持的字段类型如下:

  • Sequelize.STRING: 字符串类型,可传入一个 length 参数,指定字符串的长度。
  • Sequelize.UUID: UUID 类型,用于表示一个全局唯一的标识符。生成 UUID 的方式是使用 RFC4122 标准定义的算法,它可以产生 128 位的二进制数,转换成十六进制字符串后的长度为 32。
  • Sequelize.INTEGER: 整数类型,支持传入一个 length 参数,指定整数的长度。
  • Sequelize.FLOAT: 浮点数类型,支持传入一个 precision 和一个 scale 参数,分别表示精度和小数位数。
  • Sequelize.BOOLEAN: 布尔类型。
  • Sequelize.TIME: 时间类型,保存时分秒信息,精确到秒。
  • Sequelize.DATE: 日期类型,保存年月日信息。
  • Sequelize.DATEONLY: 日期类型,只保存年月日信息。
  • Sequelize.ENUM: 枚举类型,支持传入一个可枚举的值列表。例如:Sequelize.ENUM('foo', 'bar', 'baz')
  • Sequelize.JSON: JSON 类型,可以存储任意 JSON 序列化后的数据。
  • Sequelize.JSONB: JSONB 类型,和 JSON 类型类似,但是它会在存储数据时对其进行二进制编码,对于包含大量重复数据或长度超过 2kB 的 JSON 数据,使用 JSONB 类型可以提高存储和查询的效率。
  • Sequelize.ARRAY: 数组类型,支持传入一个基础类型的参数,例如 Sequelize.ARRAY(Sequelize.INTEGER) 表示整数数组。
  • Sequelize.TEXT: 文本类型,可以存储任意长度的文本字符串。
  • Sequelize.BLOB: 二进制类型,可以存储任意长度的二进制数据。

字段选项

除了类型外,每个字段还可以定义多个选项,用于指定字段的属性和约束条件。

  • primaryKey: 是否为主键,类型为布尔值,默认为 false
  • autoIncrement: 是否为自增类型,类型为布尔值,默认为 false
  • allowNull: 是否允许为空值,类型为布尔值,默认为 true
  • unique: 是否唯一,类型为布尔值或一个字符串,默认为 false。如果设置为字符串,则表示唯一性索引的名称。例如:unique: 'foo' 表示创建一个名为 foo 的唯一性索引。
  • comment: 字段的注释,类型为字符串,默认为 null
  • defaultValue: 默认值,可以是一个固定值或一个函数,类型可以根据上面介绍的字段类型进行自行推导。
  • field: 字段的名称,如果不指定,则默认为模型属性的名称。
  • validate: 字段值的验证规则,可以是一个数组或一个对象。数组中的每个元素都是一个验证器函数,对象的每个属性都是一个验证器函数。每个验证器函数都有两个参数:第一个参数为需要验证的属性值,第二个参数为当前验证器所在的上下文对象,通过上下文对象可以访问整个模型的所有属性,可以实现多个属性之间的联合验证。例如:
-- -------------------- ---- -------
----- - ---------- ----- - - ---------------------

----- ------- ------- ----- --
--------------
  ------ -
    ----- -----------------
    ---------- ------
  --
  ----- ---------------
  ------- ----------------------- -------------
-- -
  ----------
  ---------- ----------
  --------- -
    ---------------------------- -
      -- ----------- -- --------- -- ------------------ - ----------------- - ----- -
        ----- --- ------------ --- ---- ------ ------ --- ------ --------
      -
    --
  --
---
展开代码

上面的例子中,我们定义了一个 Article 模型,它拥有 titlebodystatus 三个字段。而在 validate 选项中,我们定义了一个名为 validateTitleAndBodyLength 的验证器函数,用于验证 titlebody 的长度之和是否超过了 1000,如果超过则抛出一个错误。

关联关系

在 Sequelize 中,模型之间可以有多种关联关系,包括一对一、一对多、多对多等。下面我们举例说明如何定义这些关联关系。

一对一

假设我们有一个 User 模型和一个 Profile 模型,一个用户只能有一个个人资料,一个个人资料也只能对应一个用户。这时我们就可以使用一对一的关联关系。

-- -------------------- ---- -------
----- - ---------- ----- - - ---------------------

----- ---- ------- ----- --
-----------
  ----- -----------------
-- - ---------- ---------- ------ ---

----- ------- ------- ----- --
--------------
  ------ -----------------
-- - ---------- ---------- --------- ---

---------------------
------------------------
展开代码

在上面的代码中,我们调用了 hasOnebelongsTo 两个方法分别为 UserProfile 定义了关联关系。hasOne 表示一对一中的“拥有方”,也就是 User 模型,而 belongsTo 表示一对一中的“被拥有方”,也就是 Profile 模型。这段代码的作用是让 User 模型拥有一个名为 Profile 的属性,并将其与 Profile 模型进行关联,而在 Profile 模型中,也会增加一个名为 User 的属性,并将其与 User 模型进行关联。

一对多

假设我们有一个 Article 模型和一个 Comment 模型,一篇文章可以有多个评论,而一个评论只能属于一篇文章。这时我们就可以使用一对多的关联关系。

-- -------------------- ---- -------
----- - ---------- ----- - - ---------------------

----- ------- ------- ----- --
--------------
  ------ -----------------
  ----- ---------------
-- - ---------- ---------- --------- ---

----- ------- ------- ----- --
--------------
  ----- ---------------
-- - ---------- ---------- --------- ---

-------------------------
---------------------------
展开代码

在上面的代码中,我们同样使用了 hasManybelongsTo 两个方法分别为 ArticleComment 定义了关联关系。这段代码的作用是让 Article 模型拥有一个名为 Comments 的数组属性,并将其与 Comment 模型进行关联,而在 Comment 模型中,也会增加一个名为 Article 的属性,并将其与 Article 模型进行关联。

多对多

假设我们有一个 User 模型和一个 Group 模型,一个用户可以属于多个组,一个组也可以有多个用户。这时我们就可以使用多对多的关联关系。

-- -------------------- ---- -------
----- - ---------- ----- - - ---------------------

----- ---- ------- ----- --
-----------
  ----- -----------------
-- - ---------- ---------- ------ ---

----- ----- ------- ----- --
------------
  ----- -----------------
-- - ---------- ---------- ------- ---

------------------------- - -------- ------------ ---
------------------------- - -------- ------------ ---
展开代码

在上面的代码中,我们调用了 belongsToMany 方法分别为 UserGroup 定义了关联关系。这段代码的作用是让 User 模型和 Group 模型之间相互关联,并创建一个名为 UserGroups 的关联表,该表将两个模型的 ID 存储在其中,以建立两个模型之间的多对多关系。

结语

在本文中,我们详细介绍了在 Sequelize 中如何定义模型,并演示了如何使用各种字段类型、字段选项和关联关系。当使用 Sequelize 进行数据库编程时,模型是一个非常重要的概念,良好的模型设计可以大大简化数据库访问和维护工作。希望本文能够帮助读者更好地理解 Sequelize 的模型设计,从而提高对 Sequelize 的使用技巧和编程能力。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6784b3b29137010942eb865e

纠错
反馈

纠错反馈