Part 1: 基本

South チュートリアルへようこそ; ここでは South の基本的な使用方法をカバーするだけでなく、また違う方法についての一般的なヒントも提供しています。

もしマイグレーションライブラリの概念について聞いたこともない場合には マイグレーションとは? をまずお読み下さい; South (と django-evolution のような他のアプリ) が実現しようとしていることを理解する助けにもなるはずです。

このチュートリアルは South を既に正しくインストールしていることを前提としています; もしまだインストールしていなければ インストールについての説明 をご覧下さい。

さあとりかかろう

このチュートリアルでは、新規アプリケーションにマイグレーションを適用していく過程を追っていきます。 既存のアプリを変換したい場合も心配はいりません; ちゃんと次の章で説明します。

最初に注意すべきは、South は各アプリケーションを対象に動作するという点です; マイグレーションはアプリのコードと一緒に保存されます [1] 。 アプリにマイグレーションが定義されていない場合、South はそのアプリを無視して、標準の(つまり syncdb を使用した)処理を行います。

[1]お望みならば マイグレーションを他の場所に保存する ことも可能です。

それでは South を組込むプロジェクトを見つけて(もしくは新規に作成して、データベースやその他の設定を行なって下さい) [*] 、 新しいアプリを作成しましょう:

./manage.py startapp southtut
[*]訳注: ここで south_migrationhistory テーブルを作成するため、South 導入プロジェクトに対する syncdb が必要なはず

ここで、いつものように新しく southtut/ ディレクトリが作成されます。 まずは INSTALLED_APPS にアプリを追加して、次に southtut/models.py を開き、新しいモデルを作成します:

from django.db import models

class Knight(models.Model):
    name = models.CharField(max_length=100)
    of_the_round_table = models.BooleanField()

シンプル過ぎますが、これだけで十分でしょう。 さて、データベースにモデルのテーブルを作るため syncdb を走らせるかわりに、 マイグレーションを作成しましょう。

最初のマイグレーション

South にはマイグレーション生成の方法がいくつか; 自動的な方法も、手動で行う方法もあります。 基本的には、ふたつの自動的な方法 - --auto--initial を使えばいいでしょう。

--auto は前回のマイグレーションを見て、何が変更されたのかを割り出し、 差分を適用するマイグレーションを生成します - 例えば、あるモデルにフィールドを追加した場合、 --auto はこの変更を検知して、追加フィールド用の新しいカラムを、 そのモデルのテーブルに追加するようなマイグレーションを生成します。

--auto には前回のマイグレーションが必要、ということがわかったと思いますが、 新規作成したアプリにはまだマイグレーションがありません。 その代わり、この場合には、アプリ内の全モデルのテーブルとインデックスを生成する --initial を使う必要があります; syncdb と同じように、まず最初にこれを使えば、それ以降の --auto はその前のマイグレーションを使用します。

では、最初のマイグレーションを作りましょう:

$ ./manage.py schemamigration southtut --initial
Creating migrations directory at '/home/andrew/Programs/litret/southtut/migrations'...
Creating __init__.py in '/home/andrew/Programs/litret/southtut/migrations'...
 + Added model southtut.Knight
Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate southtut

ご覧のように、migrations ディレクトリが作られて、その下に新しいマイグレーションが生成されました。 次に、この新しくできたマイグレーションを適用しましょう:

$ ./manage.py migrate southtut
 Running migrations for southtut:
 - Migrating forwards to 0001_initial.
 > southtut:0001_initial
 - Loading initial data for southtut.

これで South は Knight モデル用の新しいテーブルを作成しました; よければ ./manage.py shell を使って確認したり、いくつか Knight を追加してみて下さい。

モデルの変更

今までのところ syncdb でできることしかやっていません; そろそろモデルの変更をしていきましょう。 では、モデルにもうひとつフィールドを追加してみます:

from django.db import models

class Knight(models.Model):
    name = models.CharField(max_length=100)
    of_the_round_table = models.BooleanField()
    dances_whenever_able = models.BooleanField()

さて、マイグレーションが無ければ、 southtut_knight テーブルに新しいカラムを追加するのは、 どれだけ贔屓目に見ても、面倒な作業でしかありません。しかし South を使っていれば、やることは たった 2 ステップだけです; 今回の変更に対するマイグレーションの作成と、その適用です。

まず --auto 機能で新しいマイグレーションを作ります:

$ ./manage.py schemamigration southtut --auto
 + Added field dances_whenever_able on southtut.Knight
Created 0002_auto__add_field_knight_dances_whenever_able.py. You can now apply this migration with: ./manage.py migrate southtut

(South は自動的にマイグレーション名を選定する点に注意して下さい; 引数に渡すことで、カスタムマイグレーション名を指定することもできます)

次に、これを適用しましょう:

$ ./manage.py migrate southtut
Running migrations for southtut:
 - Migrating forwards to 0002_auto__add_field_knight_dances_whenever_able.
 > southtut:0002_auto__add_field_knight_dances_whenever_able
 - Loading initial data for southtut.

これで新しいカラムが作成されました; 再度確認してみましょう。 dances_whenever_able フィールドを持つ Knight を追加することができると思います。

ここまでで South の基本的な使用法がわかったので Part 2: 高度な変更 に進みましょう。

Table Of Contents

Previous topic

チュートリアル

Next topic

Part 2: 高度な変更

This Page