銀河鉄道

Python【What Is Pydantic?】The Data Validation Engine Behind FastAPI

サムネイル
[Python]Pydantic:The data validation

What Is Pydantic (and Why It Matters)

Pydantic is the data validation engine behind FastAPI — a Python library that guarantees your API’s data remains accurate, type-safe, and consistent.

The data validation engine
  • a Python library
  • accurate, type-safe, and consistent
  • predictability

So how does Pydantic guard your data?

By defining a schema.

Defining a Schema with Pydantic

Why You Need a Schema

When building APIs with FastAPI, you must define the structure of the data your API will receive and return.

the “shape” of your data — is called a schema.

the design that keeps your API predictable and trustworthy.

予測可能で信頼できるものに保つもの

How to Write a Schema

This is the Schema.

from pydantic import BaseModel

class SearchRequest(BaseModel):
    query: str
    topk: int

If a user sends this JSON:

{"query": "moon phases", "topk": "five"}

FastAPI will automatically return an error:
topk must be an integer, not a string.
That’s Pydantic at work — validating your data before it ever reaches your logic.

How JSON Validation Works

FastAPI communicates with clients using JSON.
But the data you receive isn’t always correct.

Examples:

  • "topk": "3" → value is a string, not an integer.
  • Missing "query" field → incomplete data.

That’s where Pydantic steps in.

It checks for missing or invalid fields and automatically returns an error response — preventing both bugs and security issues.

Summary: The Structural Logic

ElementRoleExample
PydanticモデルDefines data structure (schema)
データ構造(スキーマ)の定義
class SearchRequest(BaseModel):
Request SchemaIncoming data structure
クライアントが送るデータ
query, topk, mode
Response SchemaOutgoing data structure
サーバーが返すデータ
result, status, error
FastAPIAutomatically validates using schema
スキーマで自動検証
Checks immediately on request
リクエスト時に即チェック

Sample Directory Structure

project_name/api/
├─ main.py        … FastAPIアプリ本体・共通初期化・Router登録・/dashboard
├─ models.py          … Pydanticの入出力スキーマ(全エンドポイント共通)
└─ routers/
   ├─ chat.py         … /search /ask /generate(チャット系API)
   ├─ stats.py        … /stats/*(ヘルス・計測・可観測性)
   ├─ admin_canary.py … /admin/canary/*(カナリア配信の切替・比率)
   ├─ admin_incidents.py … /admin/incidents/*(インシデント運用)
   ├─ admin_backup.py … /admin/backup/*(バックアップ運用)
   └─ admin_cache.py  … /admin/cache/*(キャッシュ運用)

Core Structure of FastAPI|Definition → Action → Execution

FastAPI Application
├── models/   ← Pydantic layer
│      Defines data structures (schemas)
│      Example: SearchRequest, GenerateResponse
│
├── routers/  ← FastAPI layer
│      Defines API routes and logic
│      Example: /search, /generate
│
└── main.py   ← Application layer
       Assembles and initializes the entire app

  • models= what data looks like(定義)
  • routers= what app does(動作)
  • main/app= how everything runs(起動)

Difference Between models.py and routers

In FastAPI, Pydantic is used inside models.py to define the structure of your data.
The routers/ directory, on the other hand, uses those models to create actual API endpoints.
Together, they form the foundation of your app’s structure — definition and action.

Pydantic lives in models.
Routers are the ones who use it.

(modelsがPydantic, routersはPydanticを使う人々)

Summary

ElementMain RoleExampleConceptual Image
models.pyDefines the “blueprint” of your data

データの「設計図」を定義する
Defines input and output data structures using Pydantic classes

Pydanticのクラスで、入力・出力データの形を定義する

(e.g., SearchRequest, GenerateResponse)
What the data looks like — the layer that shapes and constrains your data

データがどういう形をしているかを決める層
routers/Defines the actual “entry points” (API endpoints)

実際の「入口(APIエンドポイント)」を定義する
Uses FastAPI’s APIRouter() to define routes like /search or /generate, and the logic that handles them

FastAPIの APIRouter() を使って /search/generate などのルートと処理内容を定義する
What the app does with data — the layer that implements behavior based on the defined structure

データを受け取って何をするかを実装する層

In short:

models.pyDefinition
routers/Action

When building an API, a router follows this flow:

receive data → validate it with a Pydantic model → return the result.

So:
models.py protects the structure.
routers operate based on that structure.

Core Pydantic Classes

クラス名役割主なフィールド
SearchRequestSearch request schema
検索リクエスト定義
query, topk, mode, rerank
AskRequestQ&A request schema
Q&Aリクエスト定義
question, highlight, use_morphology
GenerateRequestText generation schema
文章生成用リクエスト
question, stream, user_id
SearchResponse, GenerateResponseAPI responses
APIレスポンス
results, metadata, etc.
検索結果、生成結果、メタデータなど
ErrorResponse, HealthResponseError and health check schemas
エラー、ヘルスチェック用
error, status, uptime_seconds
CanaryRolloutRequest, CanaryStatusResponseCanary deployment schemas
カナリア管理用
percentage, users, etc.`

Canary deployment schemas ?

a canary in a coal mine 🐤

Note|Canary Deployment Schemas

In large-scale systems, not every update is released to everyone at once.
Instead, new versions are gradually rolled out to a small group of users first — this is called canary deployment.

🐤 The name comes from the canaries once used in coal mines.

In the past, these birds were the first to sense danger when the air turned toxic.
Similarly, in software development, a canary deployment means releasing new code to a small group of users first — to detect problems before they spread.

Vocabulary

EnglishJapanese
Schemaデータ構造の設計図
Request / Response要求 / 応答
Validation検証
Pydantic型チェック用ライブラリ
JSONデータ通信形式
Modelスキーマ定義クラス(BaseModel)
Type Hint型注釈
Error Responseエラーレスポンス
Declarative Definition宣言的定義
Integrity整合性・一貫性
  • entry layer | エントリ層
  • router | ルーター
  • middleware | ミドルウェア
  • exception handler | 例外ハンドラ
  • request/response schema | リクエスト/レスポンスのスキーマ
  • canary rollout | カナリア配信
  • observability | 可観測性
  • lifespan | ライフスパン(起動/終了フック)
  • application state | アプリケーション状態
  • dependency injection | 依存性注入

Closing Thought

FastAPI is fast — but what makes it trustworthy is Pydantic.
It’s the quiet engine that turns code into structure and structure into reliability.
Pydantic transforms speed into stability, and simplicity into safety.

Pydantic entrusts correctness to structure, not to human attention.
It prevents errors before they appear, building reliability through design.

なぜスキーマが必要か

FastAPIでAPIを作るとき、どんなデータを受け取り、どんなデータを返すかを定義しなければならない。
そのデータの「形」を決める設計図をスキーマという。

Pydantic:データ完全性の番人

Pydanticは、APIで扱うデータが正しい形式かどうかをチェックするPythonライブラリ。
受け取ったJSONが想定した型と一致しているかを検証し、正しいデータだけを通す
いわば「正しい形のデータしか通さない門番」のような存在。

JSONの中身をどう検証しているか

FastAPIの通信は基本的にJSON形式だが、送られてくるデータがいつも正しいとは限らない。

例:

  • "topk": "3" → 文字列として送られている
  • "query" が欠けている

こうした不整合をPydanticが検出し、FastAPIが自動でエラーレスポンスを返す。
これにより、バグやセキュリティ事故を未然に防ぐことができる。

補足|カナリアデプロイ用スキーマ

大規模なシステムでは、すべてのユーザーに一度に新バージョンを配信するわけではない。
まず一部のユーザーだけに段階的に展開する ―― これが カナリアデプロイ(Canary Deployment)

名前の由来は炭鉱の「カナリア」。 昔、空気が悪くなると最初に気づく存在がカナリアだった。 同じように、新しいコードをまず一部のユーザーに試してもらって、問題がないか確認する手法。

おわりに

FastAPIは速さで注目されるが、その信頼性を支えているのはPydantic。
コードを構造に変え、構造を信頼に変える静かなエンジン。
スピードを安定に、シンプルさを安全に変える──それがPydanticの真価。


Pydanticは「正しさ」を人間の注意ではなく、構造に委ねる設計思想。
エラーを起こす前に防ぎ、信頼を構造的に築く。

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧