FastAPI + SQLAlchemy 2.0 で非同期データベース操作
概要
FastAPIとSQLAlchemy 2.0を組み合わせることで非同期データベース操作を実現する方法について解説します。非同期処理を活用することで、Webアプリケーションのパフォーマンスを向上させることができます。
解決する問題や課題
従来の同期処理では、データベース操作などのI/O処理が待ち時間を引き起こし、アプリケーション全体のレスポンスタイムが遅くなる可能性があります。非同期処理を導入することで、これらの待ち時間を最小限に抑え、ユーザーエクスペリエンスを向上させることができます。
前提知識・必要ライブラリ
- Pythonの基本知識
- FastAPIの基本知識
- SQLAlchemyの基本知識
- Python 3.7以上
- FastAPI
- SQLAlchemy 2.0
環境構築
# 必要ライブラリのインストール
pip install fastapi sqlalchemy
実装コード
from fastapi import FastAPI
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import declarative_base, sessionmaker
DATABASE_URL = "sqlite+aiosqlite:///./test.db"
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
async def create_user(db: AsyncSession, name: str):
async with db() as session:
user = User(name=name)
session.add(user)
await session.commit()
async def get_users(db: AsyncSession):
async with db() as session:
return await session.execute(select(User)).scalars().all()
app = FastAPI()
@app.on_event("startup")
async def startup():
engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
await conn.run_sync(Base.metadata.create_all)
@app.get("/")
async def read_root():
async with AsyncSession() as session:
users = await get_users(session)
return {"users": users}
@app.post("/user/{name}")
async def create_user_endpoint(name: str):
async with AsyncSession() as session:
await create_user(session, name)
return {"message": "User created successfully"}
使用例
# FastAPIアプリケーションを起動して動作を確認
# http://127.0.0.1:8000/ にアクセスしてユーザー一覧を取得し、新しいユーザーを作成する
テストコード
import pytest
@pytest.mark.asyncio
async def test_create_user():
async with AsyncSession() as session:
await create_user(session, "Alice")
users = await get_users(session)
assert len(users) == 1
assert users[0].name == "Alice"
応用・カスタマイズ
FastAPIとSQLAlchemyを組み合わせることで、データベース操作を非同期に行うことができますが、パフォーマンスを最適化するためには以下の点に注意すると良いでしょう。
- クエリの最適化
- インデックスの活用
- コネクションプーリングの設定
関連技術
- FastAPI: https://fastapi.tiangolo.com/
- SQLAlchemy: https://www.sqlalchemy.org/
- SQLAlchemy Core 2.0 Documentation: https://docs.sqlalchemy.org/en/20/
—
この記事では、FastAPIとSQLAlchemyを使用して非同期データベース操作を行う方法を紹介しました。非同期処理を活用することで、Webアプリケーションのパフォーマンス向上に貢献することができます。