Pydanticのメジャーアップグレードに悩んでいませんか?v1からv2への移行で、それまで動いていたコードが突然エラーになる。設定が変わって何をどう修正すればいいのか分からない。そんな状況に陥っているエンジニアは少なくありません。
Pydantic v2は大幅な性能向上とAPI改善をもたらした一方で、互換性を保たない破壊的変更が数多く含まれています。しかし正しく理解して対応すれば、v2への移行は決して難しくありません。
本記事では、実際のエラーケースと具体的な解決策を通じて、Pydantic v2への移行をスムーズに進めるための実例ガイドを提供します。
Pydantic v2における主要な破壊的変更
Pydantic v2では、v1と互換性がない変更が複数あります。まずはどのような変更があるのかを理解することが重要です。
Configクラスからmodel_configへの移行
v1では、モデルの設定をConfigクラスで定義していました。v2ではこのアプローチが廃止され、model_configという新しい方法に統一されています。
v1の書き方:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
class Config:
validate_assignment = True
str_strip_whitespace = True
v2の書き方:
from pydantic import BaseModel, ConfigDict
class User(BaseModel):
model_config = ConfigDict(
validate_assignment=True,
str_strip_whitespace=True
)
name: str
age: int
この変更は単なる記法の違いではなく、Pydantic v2の設計思想全体に関わるものです。設定をより明示的かつ型安全に管理できるようになりました。型安全性を強化することで、本番環境でのバグをより早期に発見できます。
バリデーター関数の装飾子の変更
v1の@validatorデコレータはv2で廃止され、@field_validatorと@model_validatorに分かれました。バリデーションロジックの強化は、APIのセキュリティ向上にも直結します。特にFastAPI認証の実装を行う際には、適切なバリデーション設計が重要です。
v1の書き方:
from pydantic import BaseModel, validator
class Product(BaseModel):
price: float
@validator('price')
def price_must_be_positive(cls, v):
if v < 0:
raise ValueError('価格は正の数である必要があります')
return v
v2の書き方(フィールドレベル):
from pydantic import BaseModel, field_validator
class Product(BaseModel):
price: float
@field_validator('price')
@classmethod
def price_must_be_positive(cls, v):
if v < 0:
raise ValueError('価格は正の数である必要があります')
return v
v2の書き方(モデルレベル):
from pydantic import BaseModel, model_validator