2012-10-12

DjangoにDBのマイグレーションを行うプラグインを入れる

Djangoで manage.py syncdb をした場合、すでに存在するテーブルについては何も変更されません。models.pyをいじってスキーマを変更しても、それがDBに反映されません。
そこで、マイグレーションを行うプラグインの出番となります。どうもSouthが定番のようなので、これを入れます。

$ sudo pip install South

インストールに成功したら、settings.py を若干変更します。
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp', #自作のアプリ
    'south', #southをインストールする
    )
個人的な趣味としては、
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", "south_migrations"))
SOUTH_MIGRATION_MODULES = {
    'myapp': 'migrations.myapp',
}
という具合にして、マイグレーションのときに生成されるファイルが、プロジェクトのディレクトリの外につくられるようにしておくのがいいと思います。その方が、ローカルのプロジェクトをサーバー上にあげるときに都合がいいからです。

settings.py の編集が終わったら、普通に、manage.py syncdb をします。これによって、southが利用するDBのテーブルがつくられます。SOUTH_MIGRATION_MODULESを明示的に指定した場合は、親となるモジュール(上記の例ではmigrations)が存在しないとエラーになるので、ここでつくっておきます。ここまでできたら、

$ python ./manage.py convert_to_south myapp

を実行します。これにより、既存のアプリをsouthで管理するように設定できます。今後、モデルに変更があった場合は、

$ python ./manage.py schemamigration myapp --auto
$ python ./manage.py migrate myapp

とやれば、たいていはsouthが何とかしてくれるはずです。

0 件のコメント: