前言
Sequelize 是一个 Node.js ORM(Object-Relational Mapping) 工具,可以方便地操作数据库。在实际开发中,分页查询是一个常见的需求。本文将详细介绍在 Sequelize 中如何实现分页查询,并分享一些实际开发中的技巧。
Sequelize 中的分页查询
基本分页查询
在 Sequelize 中,分页查询可以使用 limit 和 offset 方法来实现,其中 limit 指定每页数据的数量,offset 指定查询数据的起始位置。
假设我们要查询第 3 页每页 10 条数据,可以使用以下代码:
const limit = 10;
const offset = (3 - 1) * limit;
const users = await User.findAll({
limit,
offset,
});上述代码中,User 是一个 Sequelize 定义的用户模型,findAll 方法查询所有用户数据,limit 和 offset 方法实现分页查询。其中,第 3 页对应的 offset 值为 (3 - 1) * 10 = 20,即查找第 21 条数据开始的 10 条数据。
分页查询数据总数
在实际开发中,一般需要获取数据的总数,才能实现分页查询。Sequelize 提供了 count 方法来查询符合条件的数据总数。假设我们需要查询用户表中的数据总数,可以使用以下代码:
const count = await User.count();
搭配使用 count 方法和 limit、offset 方法,我们可以轻松实现分页查询数据总数并查询指定页数的数据。具体实现代码如下:
-- -------------------- ---- ------- ----- ----- - --- ----- ------- - -- ----- ------ - -------- - -- - ------ ----- ----- - ----- ------------- ----- ----- - ----- -------------- ------ ------- --- -- ----- ----- --------- - --------------- - -------
其中,pageNum 为需要获取的页数,count 获取所有数据总数,pageCount 为总页数,使用 Math.ceil 方法获取上取整的页数。
分页查询排序
在分页查询时,还需要考虑排序的问题。Sequelize 提供了 order 方法来对查询结果进行排序。假设我们需要按照用户 ID 逆序排序,可以使用以下代码:
const users = await User.findAll({
order: [['id', 'DESC']],
});分页查询筛选
分页查询中,有时需要筛选一部分数据进行分页。Sequelize 提供了 where 方法来实现数据筛选。假设我们要查询用户表中所有年龄大于 18 岁的用户,并按照 ID 升序排序,可以使用以下代码:
-- -------------------- ---- ------- ----- ----- - --- ----- ------ - -------- - -- - ------ ----- ----- - - ---- - -------- -- - -- ----- ----- - ----- ------------ ----- --- ----- ----- - ----- -------------- ------ ------- ------ ------- -------- ------ ---
其中,Op.gt 表示大于操作符,where 代表筛选条件,使用 count 方法查询数据总数时也需要指定 where 参数,否则会查询表中的所有数据。
技巧分享
抽象出公共方法
在实际开发中,分页查询是一个常见的需求,因此我们可以将分页查询的代码进行抽象,封装成公共方法,方便在其他地方调用。
-- -------------------- ---- -------
-- --------
----- ----------- - ----- ------- -------- --------- ----- - --- ----- - --- -- -
----- ----- - ---------
----- ------ - -------- - -- - ---------
----- ----- - ----- ------------- ----- ---
----- ---- - ----- ---------------
------
------
------
-------
---
----- --------- - --------------- - ----------
------ -
-----
--------
---------
----------
------
--
--上述方法中,model 代表需要查询的 Sequelize 模型,pageNum 和 pageSize 分别代表需要查询的页数和每页数据量,where 代表查询条件,order 代表排序方式。
使用公共方法进行分页查询的示例代码如下:
// 使用分页查询公共方法查询用户表中所有年龄大于 18 岁的用户,每页 10 条数据
const userList = await getPageList(User, 1, 10, { age: { [Op.gt]: 18 } }, [['id', 'ASC']]);使用 offset 性能问题
在使用 offset 方法进行分页查询时,要特别注意性能问题。当数据量很大时,offset 方法会导致查询速度变慢,因为它会先查询前面的所有数据再返回指定页数的数据。为了避免这种情况,可以使用类似于将最后一页数据缓存起来再查询前面页数的方法,从而加快查询速度。具体实现方式可参考 此篇文章。
结语
在 Sequelize 中实现分页查询的方式并不复杂,但需要注意性能问题以及如何抽象出公共方法等实际开发技巧。希望本文对读者有所帮助,也欢迎读者分享更多实际开发中的技巧和经验。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/6782362d935627c900fcb308