在实际开发中,数据库查询是必不可少的部分。而在实现多表联合查询时,我们可以选用 Sequelize 框架来完成,该框架是 Node.js 中用于手动调用 SQL 操作的 ORM 框架,旨在提高代码质量和代码重用性,同时减少开发者的工作量和冗余代码。
本文将详细介绍 Express + Sequelize + MySQL 实现多表联合查询的实现方法,通过一个示例代码来说明。
准备阶段
我们先创建一个示例的数据库结构,包含三个表:users、orders 和 products。
-- ------ ---- ---- ------ -------- -- --- ------ ---- ------- ------- ---- ------- ---------------- -- --- ---- --- --- ----- -- -- ----- - ------ ----- -- --- ------ ----- - -- ------- -------- --- ---- --------------- ---- ----------- --- ----- --- ------ --- ----- ------ ----------- --- ----- ------- --- ---- - ------------- ------- ------------- -- -- ------ - ------ ----- -- --- ------ ------ - -- ------- -------- --- ---- --------------- ------- ------- -------- --- ----- ---------- ------- -------- --- ----- -------- ------ --- ----- ------- --- ----- ---------- ---------------- ------- --- --------- ---------- ---------- ---------- ------------------- ------- --- ------------ ---------- ------------ - ------------- ------- ------------- -- -- -------- - ------ ----- -- --- ------ -------- - -- ------- -------- --- ---- --------------- ---- ----------- --- ----- ----- ----------- -- --- ----- ----- ------ --- ----- ------- --- ---- - ------------- ------- -------------
我们定义了三个表:
- users 表,用于存储用户信息;
- orders 表,用于存储订单信息,其中,每个订单都关联一个用户和一个产品;
- 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