Flask-flask中的后台分页查询实现

在后台查询数据并在前台展示的场景中,当数据量较大时,页面加载会非常缓慢,此时建议使用后台分页查询的形式。在flask中,基于Flask-SQLAlchemy可以使用以下方式实现。

方法一:

Flask-SQLAlchemy 提供了一个 paginate()查询方法,参考:Flask 学习-73.Flask-SQLAlchemy 分页查询paginate_flasksqlalchemy分页查询_上海-悠悠的博客-CSDN博客

复制代码
page4 = Server.query.paginate(page=4, per_page=2)
print(page4.items)
page3 = page4.prev()
print(page3.items)

查看源码:

复制代码
    def paginate(
        self,
        select: sa.sql.Select[t.Any],
        *,
        page: int | None = None,
        per_page: int | None = None,
        max_per_page: int | None = None,
        error_out: bool = True,
        count: bool = True,
    ) -> Pagination:
        """Apply an offset and limit to a select statment based on the current page and
        number of items per page, returning a :class:`.Pagination` object.

        The statement should select a model class, like ``select(User)``. This applies
        ``unique()`` and ``scalars()`` modifiers to the result, so compound selects will
        not return the expected results.

        :param select: The ``select`` statement to paginate.
        :param page: The current page, used to calculate the offset. Defaults to the
            ``page`` query arg during a request, or 1 otherwise.
        :param per_page: The maximum number of items on a page, used to calculate the
            offset and limit. Defaults to the ``per_page`` query arg during a request,
            or 20 otherwise.
        :param max_per_page: The maximum allowed value for ``per_page``, to limit a
            user-provided value. Use ``None`` for no limit. Defaults to 100.
        :param error_out: Abort with a ``404 Not Found`` error if no items are returned
            and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if
            either are not ints.
        :param count: Calculate the total number of values by issuing an extra count
            query. For very complex queries this may be inaccurate or slow, so it can be
            disabled and set manually if necessary.

        .. versionchanged:: 3.0
            The ``count`` query is more efficient.

        .. versionadded:: 3.0
        """

参数说明:

page: int,指定页码,从1开始

per_page: int,每一页显示几条数据

max_per_page:每页显示最大值当指定了max_per_page时,per_page会受到这个值的限制

error_out:是否抛出错误(默认为True)

count:是否计数,默认为True

返回值:

调用 paginate()查询方法会返回一个Pagination 对象的实例

Pagination类对象的属性主要有:

has_next:如果在目前页后至少还有一页的话,返回 True。

has_prev:如果在目前页之前至少还有一页的话,返回 True。

next_num:下一页的页面数。

prev_num:前一页的页面数。

另外还有如下的可调用方法:

iter_pages():一个迭代器,返回一个在分页导航中显示的页数列表。

prev():上一页的分页对象。

next():下一页的分页对象。

方法二:

利用限制查询方式手动实现分页,参考:Flask 查询,分页,排序及逻辑运算与聚合:_flask分页查询_Gray area的博客-CSDN博客

复制代码
filters=[] # 组装通用查询过滤器filter,略
offset = (int(paging_start)-1)*int(paging_size)   
data_qry = User.query.filter(and_(*filters)).offset(offset).limit(paging_size).all()
或者
data_qry = User.query.offset(offset).limit(paging_size).all()
相关推荐
青 春 记 忆2 小时前
LeetCode 21. 合并两个有序链表|Python 解法详解
python·算法·leetcode·链表
大数据魔法师4 小时前
DuckDB高阶实战指南!多文件处理、窗口函数、性能调优、工程化落地
python·数据分析
程序员爱钓鱼4 小时前
Rust Copy详解:隐式复制与轻量数据类型
前端·后端·rust
Patrick在香港4 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术4 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
仙人球部落 揞殺5 小时前
细说ASP.NET的各种异步操作
后端·asp.net
QAQo7T6 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
醉颜凉6 小时前
蓝桥杯2025年第十六届省赛真题-最大数字 Python题解
python·职场和发展·蓝桥杯
卷无止境7 小时前
当独立开发者也能造出3A画质的游戏:Godot引擎深度解析
后端·python·godot
vx-程序开发8 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php