ソースではBaseModelを継承するけど概念としてはスキーマってことらしい
FastAPIの勉強中です。
-
スキーマ(Schema): APIの入出力のための定義(Pydantic用)
📥 リクエストモデル(入力): クライアントからのデータ検証(バリデーション)用
📤 レスポンスモデル(出力): クライアントへのデータ返却(フィルタリング・型変換)用 - モデル(Model): DBのための定義(SQLAlchemyやSQLModelなどORM用)
クライアントからのリクエストが届いてからデータベースへアクセスし、レスポンスが返却されるまでの処理フローをシーケンス図で整理してみました。
処理フロー(リクエスト → DB → レスポンス)
- Uvicorn:クライアントとAppの間に位置するWebサーバー(ASGIサーバー)
- App: FastAPIのメインインスタンス(main.py の app)
- Router: ルーティングを振り分ける APIRouter
- Endpoint: スキーマ(Pydantic)によるバリデーションを行う個別の関数
例)@router.post("/users")
クリーンアーキテクチャ(Clean Architecture)を採用しているプロジェクトの場合
クリーンアーキにおける4つの定義の役割
| 用語 | クリーンアーキでの位置づけ | 役割・依存関係 |
|---|---|---|
|
リクエスト / レスポンスモデル (Pydantic) |
DTO (Data Transfer Object) ※Presentation層 |
外界(クライアント)とのデータのやり取り専用。バリデーションやレスポンスのフィルタリングを行う。 |
|
エンティティ (Entity) (純粋なPythonクラス/非ORM) |
Domain Model ※Domain (UseCase)層 |
システムの中心(コア)。 データベースやフレームワークの都合(SQLAlchemyなど)を一切排除した、純粋なビジネスルールとデータ構造を持つ。 |
|
ORMモデル (SQLAlchemyなど) |
Data Model ※Infrastructure層 |
データベースのテーブル構造と1対1で対応する定義。エンティティのデータをDBに保存・取得するためだけに使う。 |
- 📥 入力(リクエスト時):
Pydantic(リクエストDTO) ➔ Domainエンティティ ➔ ORMモデル - 📤 出力(レスポンス時):
ORMモデル ➔ Domainエンティティ ➔ Pydantic(レスポンスDTO)
参考リンク