Django Evolution で Model の変更をデータベースに反映させる その2

Stored evolutions

もうちょっとマニュアルを読んだので、 前回 の続きを書いてみます。前回は、

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

で、実行しましたが、一旦ファイルに保存してから行う、 Stored evolutions という方法も試してみます。モデルを作って、変更するところまでは、まったく同じです。最初の syncdb を行って、モデルを変更した後、まず、guestbook アプリケーションディレクトリに evolutions ディレクトリ(モジュール)を作って、次のように evolve --hint の出力を evolutions ディレクトリ内のファイルに書き出します。

$ mkdir guestbook/evolutions
$ python manage.py evolve --hint > guestbook/evolutions/add_tags_and_is_public.py

evolutions/add_tags_and_is_public.py

#----- Evolution for guestbook
from django_evolution.mutations import *
from django.db import models

MUTATIONS = [
    AddField('GuestBook', 'tags', models.CommaSeparatedIntegerField, initial='', max_length=255),
    AddField('GuestBook', 'is_public', models.BooleanField, initial=True)
]
#----------------------
Trial evolution successful.
Run './manage.py evolve --hint --execute' to apply evolution.

あ、↑の最後の2行はいらないですね。消しておきましょう。次に、evolutions 内に __init__.py を設置します。 __init__.py には、↓のようなことを書きます。これは、実行する evolution ファイルのリストです。複数ある場合は、複数指定できます。

SEQUENCE = ['add_tags_and_is_public']

これで、

$ python manage.py evolve

を実行します。ここでは、単に、 evolve だけで大丈夫です。勝手に、guestbook アプリ内の evolutions モジュールを読み込んでくれます。で、以下のように出力されます。これは、 --hint のときの出力とほぼ一緒ですね。最後の1行が違います。

#----- Evolution for guestbook
from django_evolution.mutations import *
from django.db import models

MUTATIONS = [
    AddField('GuestBook', 'tags', models.CommaSeparatedIntegerField, initial='', max_length=255),
    AddField('GuestBook', 'is_public', models.BooleanField, initial=True)
]
#----------------------
Trial evolution successful.
Run './manage.py evolve --execute' to apply evolution.

evolve だけでは、実際の処理は行われないので、 --execute をつけて実行します。

$ python manage.py evolve --execute

yes と答えると、データベースに反映されます。前回と同じようにデータは無事に残っています。

sqlite> select * from guestbook_guestbook;
test|2008-10-13 14:46:31.744999|1|hfunai||1

これで、テスト環境での動作が確認できれば、本番環境でも同じように、 ./manage.py evolve を実行したらいいので、楽になりそうです。これは使える。きっと使える。次回は、SQL で evolutions を保存しておく方法の予定です。

Posted at: 
2008/10/15 04:31:34
0 Comments
0 TrackBacks
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2008/10/15/django_evolution_2/trackback/

TrackBacks

まだ登録されていません。

Comments

まだ登録されていません。

Add Comment

Add Comment