Files
student-management-system/dao/pagination.py
T

29 lines
822 B
Python
Raw Normal View History

2026-09-18 16:53:21 +08:00
# dao/pagination.py
# 通用分页工具:各 DAO 复用,避免每个模块重复写 count / offset / limit
from typing import Any, List, Optional, Tuple
from sqlalchemy.orm import Query
def paginate(
query: Query,
page: int,
size: int,
order_by: Optional[Any] = None,
) -> Tuple[int, List[Any]]:
"""
对查询对象分页。
:param query: 已带好过滤条件的 Query 对象
:param page: 页码,从 1 开始
:param size: 每页数量
:param order_by: 排序字段(一般传模型主键),不传则沿用 query 自带排序
:return: (总记录数, 当前页记录列表)
"""
if order_by is not None:
query = query.order_by(order_by)
total = query.count()
items = query.offset((page - 1) * size).limit(size).all()
return total, items