You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.2 KiB

Pydantic v1 から Pydantic v2 への移行

古い FastAPI アプリがある場合、Pydantic v1 を使っているかもしれません。

FastAPI 0.100.0 は Pydantic v1 / v2 のどちらにも対応しており、インストールされている方を使用しました。

FastAPI 0.119.0 では、Pydantic v2 内からの Pydantic v1 の部分的サポート(pydantic.v1)が導入され、v2 への移行が容易になりました。

FastAPI 0.126.0 で Pydantic v1 のサポートは終了しましたが、しばらくの間は pydantic.v1 は利用可能でした。

/// warning | 注意

Pydantic チームは Python の最新バージョン、つまり Python 3.14 から、Pydantic v1 のサポートを終了しました。

これには pydantic.v1 も含まれ、Python 3.14 以上ではサポートされません。

Python の最新機能を使いたい場合は、Pydantic v2 を使用していることを確認する必要があります。

///

古い FastAPI アプリで Pydantic v1 を使っている場合、ここでは Pydantic v2 への移行方法と、段階的移行を助ける FastAPI 0.119.0 の機能 を紹介します。

公式ガイド

Pydantic には v1 から v2 への公式の 移行ガイド があります。

変更点、検証がより正確で厳密になった点、注意事項などが含まれます。

何が変わったかをよりよく理解するために参照してください。

テスト

アプリに対するテストを用意し、継続的インテグレーション(CI)で実行するようにしてください。

これにより、アップグレード後も期待どおり動作していることを確認できます。

bump-pydantic

多くの場合、カスタマイズのない通常の Pydantic モデルを使っていれば、v1 から v2 への移行作業の大半を自動化できます。

同じ Pydantic チームが提供する bump-pydantic を使用できます。

このツールは必要なコード変更のほとんどを自動で行います。

その後テストを実行し、問題なければ完了です。😎

v2 における Pydantic v1

Pydantic v2 には、Pydantic v1 がサブモジュール pydantic.v1 として同梱されています。ただし、これは Python 3.13 を超えるバージョンではサポートされません。

つまり、Pydantic v2 の最新バージョンをインストールし、このサブモジュールから旧 Pydantic v1 のコンポーネントをインポートして、あたかも v1 をインストールしているかのように使用できます。

{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *}

v2 内の Pydantic v1 に対する FastAPI のサポート

FastAPI 0.119.0 以降では、移行を容易にするため、Pydantic v2 内の Pydantic v1 に対する部分的サポートもあります。

そのため、Pydantic を v2 の最新に上げ、インポートを pydantic.v1 サブモジュールに切り替えるだけで、多くの場合そのまま動作します。

{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *}

/// warning | 注意

前述のとおり、Python の最近のバージョン(Python 3.14 以降)では Pydantic v1 がサポートされないため、pydantic.v1 の使用も Python 3.14 以上ではサポートされません。

///

同一アプリでの Pydantic v1 と v2

Pydantic v2 のモデルのフィールドに Pydantic v1 のモデルを(またはその逆を)埋め込むことは、Pydantic では「サポートされていません」。

graph TB
    subgraph "❌ Not Supported"
        direction TB
        subgraph V2["Pydantic v2 Model"]
            V1Field["Pydantic v1 Model"]
        end
        subgraph V1["Pydantic v1 Model"]
            V2Field["Pydantic v2 Model"]
        end
    end

    style V2 fill:#f9fff3
    style V1 fill:#fff6f0
    style V1Field fill:#fff6f0
    style V2Field fill:#f9fff3

...しかし、同じアプリ内で Pydantic v1 と v2 を別々のモデルとして分けて使うことは可能です。

graph TB
    subgraph "✅ Supported"
        direction TB
        subgraph V2["Pydantic v2 Model"]
            V2Field["Pydantic v2 Model"]
        end
        subgraph V1["Pydantic v1 Model"]
            V1Field["Pydantic v1 Model"]
        end
    end

    style V2 fill:#f9fff3
    style V1 fill:#fff6f0
    style V1Field fill:#fff6f0
    style V2Field fill:#f9fff3

場合によっては、同じ FastAPI の path operation 内で、Pydantic v1 と v2 の両方のモデルを扱うことも可能です:

{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *}

上の例では、入力モデルは Pydantic v1、出力モデル(response_model=ItemV2 で定義)は Pydantic v2 です。

Pydantic v1 のパラメータ

Pydantic v1 のモデルで BodyQueryForm などの FastAPI 固有のパラメータユーティリティを使う必要がある場合、v2 への移行が完了するまでの間は fastapi.temp_pydantic_v1_params からインポートできます:

{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *}

段階的に移行

/// tip | 豆知識

まずは bump-pydantic を試してください。テストが通り、問題なければコマンド一発で完了です。

///

bump-pydantic が適用できない場合は、同一アプリで v1 と v2 のモデルを併用できるサポートを利用して、徐々に v2 へ移行できます。

まず Pydantic を v2 の最新にアップグレードし、すべてのモデルのインポートを pydantic.v1 に切り替えます。

その後、モデルをグループごとに少しずつ Pydantic v1 から v2 へ移行していきます。🚶