はじめに
最近、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
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 を設定します。
import models
target_metadata = models.Base.metadata
URL の設定
.ini ファイルを使う場合
alembic.ini
の以下の部分を修正すればOKです。
sqlalchemy.url = driver://user:pass@localhost/dbname
set_main_option を使う場合
パスワードなどを直接記述したくない場合は、Configクラスのset_main_optionメソッドを使います。
alembic.ini
の上記の部分は削除し、env.py
に URL の設定を記述します。
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