いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「SQLAlchemyのモデルを変更するたびに、本番のテーブル定義を手作業で直していて事故が怖い」とお考えではありませんか?
SQLAlchemyでモデルを追加・変更するたびに、開発環境と本番環境のテーブル定義がずれてしまう経験は珍しくありません。
Alembicを導入すれば、モデルの変更履歴をコードとして管理し、コマンド一発でスキーマを反映できるようになります。



導入手順自体はシンプルなので、サクッと解説します。
ということで、本記事ではPythonでAlembicを使ってデータベースマイグレーションを実装する方法を解説します。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【Python】Alembicでマイグレーションを実装する方法
早速ですが、PythonでAlembicを使ってデータベースマイグレーションを実装する手順を紹介します。
Alembicの準備
まずは、Alembicのインストールと初期設定を行います。
pipでAlembicとSQLAlchemyをインストールします。
pip install alembic sqlalchemyプロジェクトのルートで初期化コマンドを実行します。
alembic init alembic実行すると、設定ファイルのalembic.iniと、マイグレーションスクリプトを格納するalembicディレクトリが生成されます。



ディレクトリ名は自由に決められますが、そのままalembicにしておくのが分かりやすいです。
alembic.iniのsqlalchemy.urlに、接続先データベースのURLを設定します。
sqlalchemy.url = postgresql+psycopg2://user:password@localhost:5432/app_db次に、alembic/env.pyのtarget_metadataに、SQLAlchemyのモデルが持つメタデータを渡します。
from app.models import Base
target_metadata = Base.metadata設定するとAlembicがモデルの現在の状態とデータベースの状態を比較できるようになり、差分の自動検出が可能になります。
マイグレーションファイルの作成と適用
準備ができたら、実際にマイグレーションファイルを作成して適用します。
まず、テーブルに対応するモデルをSQLAlchemyで定義します。
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
email = Column(String(255), unique=True, nullable=False)--autogenerateオプションを付けてrevisionコマンドを実行すると、モデルとデータベースの差分からマイグレーションファイルが自動生成されます。
alembic revision --autogenerate -m "create users table"生成されたalembic/versions/配下のファイルには、upgrade()関数とdowngrade()関数が自動で書き込まれます。



自動生成されたファイルはそのまま使わず、必ず中身を目で確認する癖をつけておくと安心です。
マイグレーションファイルの内容を確認したら、upgradeコマンドでデータベースに反映します。
alembic upgrade headheadを指定すると、最新のリビジョンまで一括で適用されます。
downgradeとマイグレーション履歴の確認
マイグレーションを適用した後に元の状態へ戻したい場合や、現在の状態を確認したい場合のコマンドも押さえておきます。
# 1つ前のリビジョンに戻す
alembic downgrade -1
# 現在適用されているリビジョンを確認する
alembic current
# マイグレーションの履歴を一覧表示する
alembic historydowngradeは、テーブル削除やカラム削除を含むマイグレーションでは元データが失われるため、本番環境で実行する前に必ずバックアップを取っておく必要があります。



本番でdowngradeを使う場面はそう多くないですが、いざという時のために手順は確認しておいた方がいいです。







