この記事で扱うこと
FastAPIを使用したアプリケーションを開発する際に、SQLAlchemyの扱い方がわからなかったので備忘録としてまとめる。
ORMとSQLAlchemy
ORMとは・・・
オブジェクト指向プログラミングとリレーショナルデータベースの間を仲介する技術のこと。ORMを使用することで、SQLを直接記述せずにオブジェクト操作を行うことができる。
SQLAlchemyとは・・・
Pythonで広く使用されているORMライブラリ。テーブル定義、クエリの実行、リレーションシップの定義といった機能を提供する。
以下では、Userクラスがusersテーブルに対応している。
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
SQLAlchmyを使用する
-
データベースの設定を行う
-
database.py
ファイルを作成し、データベース接続を設定する -
create_engine
関数を使用して、データベースのURLを指定し、エンジンを作成する -
sessionmaker
関数を使用して、セッションを作成するための設定を行う
-
-
モデルの定義をする
-
models.py
ファイルを作成、データベースのテーブルに対応するモデルクラスを定義する -
declarative_base
関数を使用して、ベースクラスを作成する - 各モデルクラスは、Baseクラスを継承して、テーブル名と列を定義する
-
-
CRUD操作を実装する
エンドポイントを作成し、SQLAlchemyを使用してデータベース操作を行う。
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from database import SessionLocal, engine
from models import Base, User
app = FastAPI()
Base.metadata.create_all(bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/users")
def create_user(user: User, db: Session = Depends(get_db)):
db.add(user)
db.commit()
db.refresh(user)
return user
-
Session
オブジェクトでデータベースセッションを管理する。 -
query
メソッドを使用することでデータ検索する -
add
メソッドを使用してデータを追加する -
commit
メソッドを使用して変更をデータベースに反映する
マイグレーション
マイグレーションとは・・・
データベースのスキーマを変更するための仕組み。テーブル構造を変更する際に、マイグレーションを使用することで、変更を管理し、追跡することができる。
PythonではAlembic
というマイグレーションツールが利用される。SQLAlchemyと連携して動作することでさまざまな機能を提供する。
Alembicが提供する機能
- マイグレーションファイルの作成
-
alembic revision
コマンドを使用して、マイグレーションフィイルを作成する
-
- マイグレーションの実行
-
alembic upgrade
コマンドを使用して、マイグレーションを実行し、データベーススキーマを変更する
-
- マイグレーションのロールバック
-
alembic downgrade
コマンドを使用して、マイグレーションを元に戻す
-
マイグレーションを使用することで、スキーマの変更履歴を追跡することができチーム開発を行う場合でも、データベースの変更を共有することができる。また、デプロイ時にデータベースの変更を自動で変更することが可能。
Alembicを使用したマイグレーションの設定手順
-
Alembicのインストール
pip install alembic
-
Alembicの初期化
標準的なディレクトリ名はalembic
だが、任意に指定することができる。alembic init 任意のディレクトリ名
-
alembic.ini
ファイルの編集し、データベースのURLを設定する
下記はPostgreSQLを使用する場合の設定sqlalchemy.url = postgresql://username:password@hostname:port/database
-
env.py
ファイルのtarget_metadata
変数にモデルのメタデータを設定する -
マイグレーションファイルの生成
alembic revision --autogenerate -m "説明を記載"
-
マイグレーションの実行し、適用する
alembic upgrade head