Edited at

Alembicでマイグレーションスクリプトを自動生成する最小限の設定

More than 3 years have passed since last update.


はじめに

最近、SQLAlchemyを使い始めたのですが、

モデルを定義したクラスからマイグレーションスクリプトを自動生成したかったので、

マイグレーションツールであるAlembicも使うことにしました。

自動生成のために必要な最小限の設定をメモします。

なお、使用したバージョンは以下の通りです。

SQLAlchemy==0.9.8

alembic==0.7.2


パッケージのインストール

SQLAlchemy と Alembic をインストールします

pip install SQLAlchemy

pip install alembic


設定方法

やることは以下の3つです。


  • Alembic の初期化

  • metadata の設定

  • URL の設定


Alembic の初期化

こんな感じの構成だったとします。

myapp

└── models.py


models.py

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(255), nullable=False)

def __repr__(self):
return "<User(name='%s')>" % (self.name)


myapp 配下で初期化コマンドを実行します。

alembic init migrations

すると、以下のように構成が初期化されます。

myapp

├── alembic.ini
├── migrations
│   ├── README
│   ├── env.py
│   ├── script.py.mako
│   └── versions
└── models.py

なお、migrations の部分は任意です。


metadata の設定

env.py ファイルで models をインポートして metadata を設定します。


migrations/env.py

import models

target_metadata = models.Base.metadata


URL の設定


.ini ファイルを使う場合

alembic.ini の以下の部分を修正すればOKです。


alembic.ini

sqlalchemy.url = driver://user:pass@localhost/dbname



set_main_option を使う場合

パスワードなどを直接記述したくない場合は、Configクラスのset_main_optionメソッドを使います。

alembic.ini の上記の部分は削除し、env.py に URL の設定を記述します。


migrations/env.py

config.set_main_option("sqlalchemy.url", [DATABASE_URL])


pythonスクリプトなので、 [DATABASE_URL]の部分は設定ファイルから読み取るなり環境変数から読み取るなり自由にできます。


env.py のサンプル

ほとんどデフォルトのままですが、サンプルを Gist にあげました。

ここでは SQLite を使うようにしています。


マイグレーションの実行

以下のコマンドで migrations/versions ディレクトリ配下にマイグレーションスクリプトが生成されます。

alembic revision --autogenerate -m "Init tables"

そして以下のコマンドでマイグレーションを実行します。

alembic upgrade head


参考