pagination.py 823 B

12345678910111213141516171819202122232425262728293031323334353637
  1. from typing import Any, Dict
  2. from sqlalchemy import select, func
  3. from sqlalchemy.ext.asyncio import AsyncSession
  4. from sqlalchemy.sql import Select
  5. async def paginate(
  6. db: AsyncSession,
  7. stmt: Select,
  8. page: int = 1,
  9. size: int = 20,
  10. ) -> Dict[str, Any]:
  11. if page < 1:
  12. page = 1
  13. if size < 1:
  14. size = 20
  15. # ---------- 1️⃣ 查询总数 ----------
  16. count_stmt = select(func.count()).select_from(
  17. stmt.subquery()
  18. )
  19. total = await db.scalar(count_stmt) or 0
  20. # ---------- 2️⃣ 查询分页数据 ----------
  21. result = await db.execute(
  22. stmt
  23. .offset((page - 1) * size)
  24. .limit(size)
  25. )
  26. items = result.scalars().all()
  27. return {
  28. "items": items,
  29. "total": total,
  30. "page": page,
  31. "size": size,
  32. }