Model定義の変更時にDBへ簡単に反映させるDjango Evolution

※ このエントリは、はてなグループ終了に伴う、サブブログからの引越エントリ(2010/09)です。
※ 情報が古い可能性もありますので、ご留意ください。



Python / Djangoで、Model (モデル) の定義を変更した時に、DB定義も簡単に変更・反映(マイグレーション)してほしいところだが、Django には標準でそういう機構がない、と。

そこで、それを実現する「django-evolution」を使ってみた。

インストール

Ubuntu でやってみた。

$ sudo apt-get install python-django-evolution

設定とか

settings.py を編集し、"INSTALLED_APPS" に以下のような感じで追記。

INSTALLED_APPS = (
    ・・・省略・・・
    'django_evolution',
)

次に、本題の models.py を編集し、定義変更したいカラムを弄ります。
試しに、"max_length" の値を変更してみた。以下、実行例です。

DB定義を変更するための DDL (DML) を確認

$ ./manage.py evolve --hint --sql
-- Evolve application server
UPDATE `servers` SET `memo`=LEFT(`memo`,2048);
ALTER TABLE `servers` MODIFY COLUMN `memo` varchar(2048);

実際に、DB定義を変更・反映する

一応↑でどんな DDL (DML) が発行されるか確認の上、実行しましょう。
途中で、実行してよいかの確認があります。

$ ./manage.py evolve --hint --execute

You have requested a database evolution. This will alter tables
and data currently in the 'srvmgr' database, and may result in
IRREVERSABLE DATA LOSS. Evolutions should be *thoroughly* reviewed
prior to execution.

Are you sure you want to execute the evolutions?

Type 'yes' to continue, or 'no' to cancel: yes
Evolution successful.

実際に変更を確認し、DBマイグレーションdone.