29 lines
822 B
Python
29 lines
822 B
Python
# 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 |