Help us understand the problem. What is going on with this article?

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

More than 5 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

参考

furi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away