分页查询
paginate 是 Flask-SQLAlchemy 提供的用于分页查询的方法。它的基本用法如下:
query_result = YourModel.query.paginate(page, per_page, error_out=True)
这里的参数含义如下:
- page: 表示当前要显示的页数,从1开始计数。
- per_page: 表示每页显示的条目数。
- error_out: 如果设置为 True(默认值),当请求的页数超出了范围时,将引发 404 Not Found 错误。如果设置为 False,将返回一个空的 Pagination 对象。
返回值是一个 Pagination 对象,该对象包含以下常用属性:
- items: 当前页的数据列表。
- page: 当前页码。
- per_page: 每页显示的条目数。
- total: 总共的条目数。
- pages: 总共的页数。
- has_prev: 是否有上一页。
- has_next: 是否有下一页。
- prev_num: 上一页的页码。如果是首页返回None。
- next_num: 下一页的页码。如果是末页返回None。
- next():下一页
- preview():上一页
以下是一个简单的示例,演示如何在 Flask 路由中使用 paginate 方法:
from app import app
from model import *
from pprint import pprint
with app.app_context():
r = Profile.query.paginate(1, 4)
print("items:")
pprint(r.items)
print("total:")
pprint(r.total)
print("page:")
pprint(r.page)
print("pages:")
pprint(r.pages)
print("per_page:")
pprint(r.per_page)
print("has_prev:")
pprint(r.has_prev)
print("has_next:")
pprint(r.has_next)
print("prev_num:")
pprint(r.prev_num)
print("next_num:")
pprint(r.next_num)
# 下一页
r = r.next()
print("下一页")
pprint(r.items)
# 链式使用下一页
print("链式使用下一页")
r = r.next().next()
pprint(r.items)
# 链式使用上一页
print("链式使用上一页")
r = r.prev().prev()
pprint(r.items)
返回结果
pagenate与offset limit组合的区别
limit 配合 offset 可以用来实现简单的分页,因此在某些情况下,你可以使用 limit 和 offset 替代 paginate。然而,paginate 提供了更便捷和包装更完整的分页功能,它还返回一个包含分页信息的 Pagination 对象。
# 使用 limit 和 offset 进行分页
page_number = 2
per_page = 10
offset = (page_number - 1) * per_page
paged_profiles = Profile.query.limit(per_page).offset(offset).all()
这里,limit(per_page)
表示每页显示的记录数量,而 offset(offset)
表示偏移量,即从查询结果中的第几条记录开始。
而使用 paginate
方法更为简洁:
# 使用 paginate 进行分页
pagination = Profile.query.paginate(page=2, per_page=10)
paged_profiles = pagination.items
在这个例子中,paginate 方法通过 page 和 per_page 参数实现了分页,返回的 pagination 对象包含了当前页的记录(items 属性)、总记录数、总页数等信息。
总体来说,如果你需要简单的分页,limit 和 offset 是有效的替代方案。如果你想要更方便、更全面的分页功能,特别是需要获取总记录数等信息时,建议使用 paginate 方法。