Sequelize 中的 Model(模型)详解

阅读时长 8 分钟读完

Sequelize 是 Node.js 中一款流行的 ORM 框架,它可以将 JavaScript 对象映射到关系型数据库中的表。为了实现这种映射关系,Sequelize 中有一个核心概念:Model,它是表和数据的实体。

本文将详细介绍 Sequelize 中 Model 的概念、使用方法和常见操作,并通过示例代码来阐明它们的使用。

Model 的概念

在 Sequelize 中,Model 是数据表的映射。它是一种特殊类型的类,用于定义关系型数据库表。每个 Model 都会映射到一个表,Model 的实例表示表中的一行数据。

在 Sequelize 中,Model 是使用类来定义的,这些类继承自 Sequelize.Model 类。在一个 Model 中,可以定义以下内容:

  • 表名
  • 字段
  • 关联关系
  • 查询范围(Scope)
  • 钩子函数(Hook)
  • 校验规则(Validator)

Model 的定义定义了数据表的详细信息,包括表名、字段、关联关系等。在使用 Sequelize 进行操作时,首先需要定义一个 Model,才能通过 Model 对数据库进行增删改查等操作。

下面我们来看看如何在 Sequelize 中定义 Model。

定义 Model

定义一个 Model 都需要三个参数:Model 名称、表结构、和可选的选项。在表结构中,我们需要定义表中的字段名、类型、长度、设置、默认值等等。在选项中,我们可以设置表名称、联合主键、时间戳、字符集等等。

首先,我们需要在项目中引入 Sequelize:

接着,我们可以创建一个 Sequelize 实例来连接数据库:

这里我们以 MySQL 数据库为例,如果是其它数据库,需要改变对应的 dialect。

接下来,我们可以定义 Model 了。比如我们要定义一个名为 User 的 Model,表示用户,它的表结构如下:

字段名称 类型 说明
id Integer 主键
name String 用户名
age Integer 年龄
gender String 性别
created_at Date 创建时间
updated_at Date 修改时间

那么我们可以这样定义 User 的 Model:

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

这里我们使用了定义 Model 的 sequelize.define 方法。第一个参数是 Model 的名称,第二个参数是表结构定义,我们定义了表结构的每一个字段的类型,长度等等信息。

常见操作

在定义好了 Model,我们就可以进行常见的增删改查等操作了。下面我们通过示例代码来介绍常见的操作。

查询数据

在 Sequelize 中,常用的查询操作包括 findAll、findOne 和 findByPk 等。我们以 findAll 查询为例:

这里我们使用了 findAll 方法,可以传递查询条件,在这里我们通过 where 属性指定查询条件。这里我们查询用户名为 Tom 的用户,结果会是一个包含 Tom 用户信息的数组。

插入数据

插入数据可以使用 create 方法:

这里的 create 方法会返回创建出的 User 对象,如果需要保存到数据库中,需要手动调用一个实例的 save 方法。

更新数据

更新数据可以使用 update 方法:

这里的 update 方法会返回受影响的行数。

删除数据

删除数据可以使用 destroy 方法:

这里的 destroy 方法会返回删除的行数。

Model 的高级用法

在使用 Sequelize 的 Model 进行开发时,还有一些高级用法,可以帮助我们更好的利用 Model。

关联查询

在 Sequelize 中,可以通过关联关系进行多表查询。比如我们要定义一个名为 Comment 的 Model,表示评论,我们可以这样定义:

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

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

第一句定义了 Comment 的 Model,第二句使用了 belongsTo 定义了 Comment 和 User 的关联关系,表示 Comment 属于 User;第三句则使用 hasMany 定义了 User 和 Comment 的关联关系,表示 User 拥有多条 Comment。

然后我们可以进行一些关联查询,比如这样查询一个用户同时包含用户信息和评论信息:

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

这里我们使用了 include 属性来定义多表查询,跟关系型数据库中的 JOIN 语句类似。

钩子函数

Sequelize 支持在 Model 中定义钩子函数,在执行不同步骤的时候执行一些代码,比如在插入数据前执行一些操作等等。

比如我们要在插入新数据之前将数据进行加密处理,我们可以定义如下的钩子函数:

这里我们定义了一个 beforeCreate 方法,并在其中使用 bcrypt 中的 hash 函数将密码加密处理。

校验规则

在使用 Sequelize 进行开发时,我们可以定义一些校验规则,确保传递到数据库中的数据符合我们的要求。比如我们定义一个 Model,确保用户名唯一:

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

这里我们使用了 unique 属性确保用户名唯一,又使用了 validate 属性定义校验规则。

总结

Sequelize 是 Node.js 中流行的 ORM 框架,它可以将 JavaScript 对象映射到关系型数据库中的表。在 Sequelize 中,Model 是最核心的概念,它是数据表和数据实体的映射。本文详细介绍了 Sequelize 中 Model 的概念、定义方法以及常见操作,同时也介绍了 Model 的高级用法,包括关联查询、钩子函数和校验规则等。

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

纠错
反馈