SQLAlchemy学习-13.分页查询'Query' object has no attribute 'paginate'

发布时间 2023-10-10 21:06:45作者: 上海-悠悠

前言

用过Flask-SQLAlchemy的应该知道, 它提供了一个分页查询方法 paginate(),方便我们实现在后端查询分页。
但是单独使用SQLAlchemy 却没有paginate方法,会报错:AttributeError: 'Query' object has no attribute 'paginate'

SQLAlchemy 没有paginate方法

Flask-SQLAlchemy 分页查询参考https://www.cnblogs.com/yoyoketang/p/16720577.html
在 SQLAlchemy 中单独使用paginate方法

query_objs = session.query(Project)
page_objs = query_objs.paginate(
        page=1,
        per_page=10,
        error_out=False,
        max_per_page=100
    )

运行后发现报错了AttributeError: 'Query' object has no attribute 'paginate'
因为SQLAlchemy是没有paginate方法的,paginate是flask_sqlalchemy中才有的方法

实现分页查询

我们想单独使用SQLAlchemy 实现分页功能,比如fastapi 中单独使用SQLAlchemy,sqlalchemy提供了实现分页查询的方法:即 offset(偏移量) 与 limit(数据条数限制)。
前端一般用page和size查询,如/project?page=1&size=10 查询第1页,每页显示10条数据。
于是我们需要自己转换下,把sqlalchemy自带的 offset(偏移量)与 limit(数据条数限制),转成page和size

其中limit 和 size 意思是一样的,每次输出的数量限制
offset = (page - 1) * size

示例1:/project?page=1&size=5 查询第1页,每页显示5条数据。

page = 1
size = 5
offset_data = (page - 1) * size
res = session.query(models.Project).offset(offset_data).limit(size)
print(res.all())  # [<Project(id='1',...)>, <Project(id='2',...)>, <Project(id='3',...)>, <Project(id='4',...)>, <Project(id='5',...)>]

查询到前5个数据。

示例2:/project?page=2&size=3 查询第2页,每页显示3条数据。

page = 2
size = 3
offset_data = (page - 1) * size
res = db.query(models.Project).offset(offset_data).limit(size)
print(res.all()) # [<Project(id='4', ...)>, <Project(id='5', ...)>, <Project(id='6', ...)>]