| 12345678910111213141516171819202122232425262728293031323334353637 |
- from typing import Any, Dict
- from sqlalchemy import select, func
- from sqlalchemy.ext.asyncio import AsyncSession
- from sqlalchemy.sql import Select
- async def paginate(
- db: AsyncSession,
- stmt: Select,
- page: int = 1,
- size: int = 20,
- ) -> Dict[str, Any]:
- if page < 1:
- page = 1
- if size < 1:
- size = 20
- # ---------- 1️⃣ 查询总数 ----------
- count_stmt = select(func.count()).select_from(
- stmt.subquery()
- )
- total = await db.scalar(count_stmt) or 0
- # ---------- 2️⃣ 查询分页数据 ----------
- result = await db.execute(
- stmt
- .offset((page - 1) * size)
- .limit(size)
- )
- items = result.scalars().all()
- return {
- "items": items,
- "total": total,
- "page": page,
- "size": size,
- }
|