Express + Sequelize + mysql 实现多表联合查询

在实际开发中,数据库查询是必不可少的部分。而在实现多表联合查询时,我们可以选用 Sequelize 框架来完成,该框架是 Node.js 中用于手动调用 SQL 操作的 ORM 框架,旨在提高代码质量和代码重用性,同时减少开发者的工作量和冗余代码。

本文将详细介绍 Express + Sequelize + MySQL 实现多表联合查询的实现方法,通过一个示例代码来说明。

准备阶段

我们先创建一个示例的数据库结构,包含三个表:users、orders 和 products。

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

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

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

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

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

我们定义了三个表:

  1. users 表,用于存储用户信息;
  2. orders 表,用于存储订单信息,其中,每个订单都关联一个用户和一个产品;
  3. products 表,用于存储产品信息。

步骤一:安装依赖包

我们需要安装三个包:Sequelize、mysql2 和 express。

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

在这里,我们使用了 MySQL 作为数据库,mysql2 作为 MySQL 的驱动程序。

步骤二:创建 Sequelize 实例

我们需要在项目中定义一个 Sequelize 实例来处理各种请求。首先需要初始化 Sequelize 并创建一个实例。

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

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

这里需要注意的是,我们需要传递一些选项来告诉 Sequelize 如何连接数据库。

步骤三:定义模型

定义模型是 Sequelize 实现多表联合查询的关键步骤之一,模型定义了我们查询的各种数据。在 Sequelize 中,我们可以使用 define() 方法来定义模型。

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

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

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

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

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

这里我们完成了三个模型的定义,Users、Products 和 Orders,同时我们还需要定义它们之间的关联关系。我们使用了 hasMany 和 belongsTo 来指定 Users 和 Products 与 Orders 之间的关系。一个用户可以下多个订单,一个订单仅关联一个用户。同样,一种产品可以在多个订单中被购买,而一个订单仅支持购买一种产品。

步骤四:实现多表联合查询

下面,我们将使用 Sequelize 查询顾客和他们购买的产品的数量和总价。

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

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

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

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

在这个查询中,我们使用 Sequelize 中的 findAll() 方法来查询用户、订单和产品。同时使用 attributes 来选择我们希望返回的列,而 include 则用于传递可选的关联模型。

Sequelize 支持多级嵌套查询,在我们的示例中通过 include 属性嵌套了订单和产品模型。我们还可以在模型上使用 attributes 属性选择我们需要返回的列。同时,我们还使用 sequelize.literal() 方法添加了一个子查询,计算每个订单的总价。

最后,我们通过将 raw 属性设置为 true,以获取小写格式的完整数据对象数组。

总结

以上就是在 Express + Sequelize + MySQL 中实现多表联合查询的所有步骤。Sequelize 以其简单、易用的 API 提供了强大的功能,可以帮助我们快速构建应用程序,提高我们的应用程序的性能和可扩展性。同时,Sequelize 还支持通过多种方式查询数据库,使其成为构建 Node.js 项目的理想选择之一。

完整示例代码出现在下面:

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

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

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

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

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

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

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

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

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

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

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

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6646b6e4d3423812e44d3e5f