# 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