DjangoのDBマイグレーションにsouthを使ってみます。

Djangoのツールに"South"というモノがあるようです。
このツールを使うと、DBのマイグレーションをうまいことやってくれるようです。
プロジェクトで、既存のModelにフィールドの追加が発生したためこのツールを使ってみます。DBのマイグレーションが簡単にできるようになればもうけものです。

まずはインストール

ドキュメント"Bitbucket | The Git solution for professional teams"を見てインストールをおこないます。
自分は、Mercurialを使ってソースを取得しました。Djangoアプリの部分だけ欲しかったため、一時的なディレクトにてsetup.pyのインストール作業を実施してソースを取得しました。
Djangoにsouthアプリを追加した時点(settings.pyのINSTALL_APPSに追加)でsyncdbが必要です。southの履歴管理テーブルが後々必要になるためです。

実際にマイグレーション作業

ドキュメント"Bitbucket | The Git solution for professional teams"を見ていくつか作業をおこないます。
まずは、southにアプリの現状のModelを覚えさせます。そのため、schemamigrationを使用します。

python manage.py schemamigration APP_NAME --initial

次に、通常であればmigrateを実行します。しかし、今回のようにすでにアプリが稼働中である場合でmigrateを実行すると、すでにテーブルが存在している、とエラーがでます。そのため、最初のmigrateはスキップさせる必要があるのです。--fakeを使用してスキップさせます。

python manage.py migrate APP_NAME --fake 0001

これで、新しくModelに修正を加える環境が整いました。適当なModelを修正します。修正が完了したら、schemamigrationです。そしてmigrateまで実行します。

python manage.py schemamigration APP_NAME --auto
python manage.py migrate APP_NAME

これで稼働中のアプリにsouthを追加することができました。

稼働中のシステムへのリリース

稼働中のシステムを停止させることなくDBのマイングレーションをリリースする必要がありました。今回のDBのマイグレーションは、テーブルへのカラム追加だけであったため、さほど難しくはありませんでした。
ソースのアップだけであれば、本番の環境にソースをアップした後、Apacheのプロセスの再起動をおこなうだけです。ただし、今回はDBのマイグレーションが存在するため少々別の手法をとりました。

  1. 本番環境のDBのマイグレーションを実施
    1. 本番の環境とは別の環境を用意し、その環境を使用してDBのマイグレーションを実施します。DBのマイグレーションは、上述の作業を実施します。
  2. 本番環境のソースを更新
    1. リリース対象のソースを本番環境にアップします。
  3. Apacheのプロセスの再起動
    1. プロセスを再起動して変更を適用します。