FastAPI 与 SQLModel 分页功能实现指南
1. 基础分页模型
from typing import Generic, TypeVar, Optional, List
from pydantic import BaseModel
from sqlmodel import SQLModel
T = TypeVar("T")
class PageParams(BaseModel):
page: int = 1
size: int = 10
class PageResponse(SQLModel, Generic[T]):
items: List[T]
total: int
page: int
size: int
pages: int
has_next: bool
has_prev: bool
@property
def next_page(self) -> Optional[int]:
if self.has_next:
return self.page + 1
return None
@property
def prev_page(self) -> Optional[int]:
if self.has_prev:
return self.page - 1
return None
2. 通用分页函数
2.1 基础分页查询
from sqlmodel import select, Session, func
def paginate_query(
session: Session,
query,
page: int = 1,
size: int = 10
) -> PageResponse:
total = session.exec(select(func.count()).select_from(query.subquery())).one()
pages = (total + size - 1) // size
items = session.exec(
query.offset((page - 1) * size).limit(size)
).all()
return PageResponse