ブログ
Blogs
SQLModel入門(PyCon JP 2024)

導入
最近のPythonバックエンド開発において、SQLModelが注目を集めています。
SQLModelは、FastAPIの作者によって開発されたPythonのORMライブラリで、SQLAlchemyとPydanticの強みを組み合わせて、データベース操作と型安全性を提供します。
SQLModelの特徴
モデル定義はPydanticのお作法を踏襲し、簡潔に書けます。
クエリはSQLAlchemyと同じ豊富な機能を使用できます。
FastAPIとの親和性が高く、高速な開発が可能です。
基本的なモデルの書き方では、table=Trueを指定することでテーブルとの紐付けを行います。
主キーの自動生成を期待する場合、idフィールドをOptionalにする必要があります。
これにより、作成時にidを指定せずに済みます。
========================
from sqlmodel import Field, SQLModel
class Hero(SQLModel, table=True):
__tablename__ = "heroes"
id: int | None = Field(default=None, primary_key=True)
name: str
secret_name: str
age: int | None = None
========================
外部キーを伴うモデルでは、Relationshipを使用して関連するモデルを定義します。
back_populatesを指定することで、自動的に同期が行われます。
Many to Manyの関係では、中間テーブル用のモデルを作成し、link_modelを指定します。
========================
from sqlmodel import Field, SQLModel
class Team(SQLModel, table=True):
__tablename__ = "team"
id: int | None = Field(default=None, primary_key=True)
name: str = Field(index=True)
headquarters: str
heros: list["Hero"] = Relationship(back_populates="team")
class Hero(SQLModel, table=True):
team_id: int | None = Field(foreign_key="team.id")
team: Team | None = Relationship(back_populates="heroes")
========================
Multiple Model
SQLModelの特徴的な機能であるMultiple Modelは、ORM用のモデルとAPIスキーマ用のモデルを統合し、類似したクラス間の不整合問題を解決します。
これにより、FastAPIと組み合わせて使用すると、簡潔かつ高速な開発が可能になります。
========================
class HeroBase(SQLModel):
name: str = Field(index=True)
secret_name: str
age: int | None = None
team_id: int | None = Field(foreign_key="teams.id"
class Hero(HeroBase, table=True):
id: int | None = field(default=None, primary_key=True)
team: Team | None = Relationship(back_populates="heros")
class HeroCreate(HeroBase):
pass
class HeroPublic(HeroBase):
id: int
class TeamBase(SQLModel):
name: str = Field(index=True)
headquarters: str
class Team(TeamBase, table=True):
id: int | None = field(default=None, primary_key=True)
heroes: list["Hero"] = Relationship(back_populates="team")
class TeamPublic(TeamBase):
id: int
name: str = Field(index=True)
headquarters: str
========================
Multiple Modelの利点
共通属性を基底クラスで定義し、継承で再利用することで、コードの重複を減らし、保守性を向上させます。
入力と出力の型が正確に定義できます。
OpenAPIの定義が正確になり、クライアント側に正確な型定義を提供できます。
Multiple Modelを使用する際は、取得用と更新用でBaseModelを分けるアプローチや、ユーザータイプごとにモデルを分割するアプローチがあります。
システムの将来の展望や変更のしやすさを考慮して、適切なアプローチを選択することが重要です。
まとめ
SQLModelを使用することで、豊富なORM機能を使いながら、簡潔で高速なシステム開発が可能になります。
Pydanticを継承しているため、FastAPIとシームレスに統合でき、Multiple Modelによって関心の分離と保守性に優れたシステム開発を実現できます。
SQLModelは、型安全性とパフォーマンスを両立させたモダンなPythonバックエンド開発のための強力なツールです。
ぜひ、あなたのプロジェクトでSQLModelを試してみてください!
