Djangoとは異なり、FastAPIはデータベースに関して特定の方針を持ちません(unopinionated)——ライブラリは自分で選びます。一般的な選択肢はSQLAlchemyで、しばしばSQLModel(FastAPIの作者によるもので、SQLAlchemy + Pydanticを組み合わせたもの)と併用されます。データベースのセッションは依存性注入(dependency injection)を通じて提供されます。
SQLAlchemyのセットアップ
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
engine = create_engine("postgresql://user:pass@localhost/db")
SessionLocal = sessionmaker(bind=engine)
Base = declarative_base()
class User(Base): # an ORM model (maps to a table)
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String, unique=True)
依存性を通じたDBセッションの提供
def get_db():
db = SessionLocal()
try:
yield db # provide the session
finally:
db.close() # ALWAYS close after the request (cleanup)
@app.get("/users/{id}")
def get_user(id: int, db: Session = Depends(get_db)): # inject a session per request
user = db.query(User).filter(User.id == id).first()
if not user:
raise HTTPException(404, "Not found")
return user
yieldを使った依存性のパターンは、セッションを管理する標準的な方法です。リクエストごとに1つのセッションを開き、それを注入し、その後自動的にクローズします——すべてのエンドポイントがクリーンで適切にクローズされたセッションを得られます。
SQLModel —— SQLAlchemy + Pydanticを1つに
from sqlmodel import SQLModel, Field, Session, select
class User(SQLModel, table=True): # ONE class = ORM model AND Pydantic model
id: int | None = Field(default=None, primary_key=True)
name: str
email: str
@app.get("/users")
def list_users(db: Session = Depends(get_session)):
return db.exec(select(User)).all() # query; results are also valid response models
SQLModelはORMモデルとPydanticモデルを1つのクラスに統合します——これにより、データベースとAPIのスキーマ間の重複を減らせます。
マイグレーションと非同期のオプション
✓ Migrations: use Alembic (SQLAlchemy's migration tool) for schema changes
✓ Async: use SQLAlchemy's async engine + async session for async endpoints
(don't use a SYNC database driver inside async def — it blocks the event loop)
なぜ重要なのか
データベースの統合は、ほぼすべての実用的なAPIにとって不可欠です。そしてFastAPIはそれについて意図的に特定の方針を持たない(Djangoの組み込みORMとは異なり)ため、一般的なアプローチを理解しておくことは重要な実践的知識です。
標準的なパターン——SQLAlchemy(または、ORMとPydanticモデルをエレガントに統合して重複を減らすSQLModel)と、yieldパターンによる依存性注入されたセッション——は、ほぼすべてのFastAPIアプリがデータを永続化するために使うものです。
リクエストごとのセッション依存性(前に開き、後に自動的にクローズする)は、データベース接続を管理するための慣用的で正しい方法であり、SQLModelによるデータベースとAPIスキーマの統合は、FastAPI自身の作者による注目すべき生産性向上機能です。
データベースのセットアップ方法、DIを通じたセッションの提供方法、クエリの実行方法、そしてマイグレーション(Alembic)と非同期の注意点(非同期エンドポイントでは非同期ドライバを使い、ブロッキングする同期ドライバは決して使わない)の扱い方を知っておくことは、データ駆動型のFastAPIアプリケーションを構築するために必要です——FastAPIは選択の自由を与えてくれるので、慣例的で実績のある道を知っておくことは、実際のアプリを正しく構築するうえで価値があります。
