1
/
5

#15 SQLModel入門(PyCon JP 2024)

SQLModel入門 〜クエリと型〜

導入

最近の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を試してみてください!その簡潔さと柔軟性に驚くかと思います。

If this story triggered your interest, why don't you come and visit us?
業績好調のため増員募集|経験豊富な代表直下で成長できるIT法人営業
ITEEK株式会社's job postings
1 Likes
1 Likes

Weekly ranking

Show other rankings
Like 上川 諒也's Story
Let 上川 諒也's company know you're interested in their content