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

投稿日:2008/10/14 05:17:19

久々に ReviewBoard をチェックしてたら、 Django Evolution を使ってることを知りました。んで、この Django Evolution は何をしてくれるものかと調べてみたら、 Model の変更をデータベースに反映させてくれるものってことが分かって早速試してみました。

とりあえず、適当にプロジェクト&アプリ作成。Djangoは、1.0 で動かして欲しいみたいです。

$ django-admin.py startproject djtest
$ cd djtest
$ python manage.py startapp guestbook # なんでもいいけど、 guestbook とかつくる。
$ vim guestbook/models.py # guestbook の Model を書く。

guestbook/models.py はこんな感じ。

from django.db import models

class GuestBook(models.Model):
    name = models.CharField(max_length=20)
    comment = models.TextField()
    posted_date = models.DateTimeField()

    class Meta:
        pass

    def __unicode__(self):
        return self.name

Django Evolution をチェックアウトしてプロジェクトディレクトリにコピー、 settings.py を書く。

$ svn checkout http://django-evolution.googlecode.com/svn/trunk/ django-evolution
$ cd django-evolution && cp -r django_evolution /path/to/djtest # プロジェクトディレクトリにコピー
$ vim settings.py # データベースの設定とかしつつ、 INSTALLED_APPS に 'django-evolution' を追加。

settings.py の変更したとこだけ。

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'djtest'

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django_evolution',
    'guestbook',
)

とりあえず、これで一度、 syndb を。

$ python manage.py syncdb

sqlite> .schema guestbook_guestbook してみると、

CREATE TABLE "guestbook_guestbook" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(20) NOT NULL,
    "comment" text NOT NULL,
    "posted_date" datetime NOT NULL
);

guestbook/models.py をちょっと書きかえました。tags と is_public の追加です。リレーションとかするとちょっとめんどそうなので、とりあえずあたりさわりなさそうな感じで。ちなみに必須フィールドは初期値を入れておかないとうまくいきません。この辺のことは次回調べてみようかと。

from django.db import models

class GuestBook(models.Model):
    name = models.CharField(max_length=20)
    tags = models.CommaSeparatedIntegerField(max_length=255, blank=True)
    comment = models.TextField()
    is_public = models.BooleanField(default=True)
    posted_date = models.DateTimeField()

    class Meta:
        pass

    def __unicode__(self):
        return self.name

ちなみに現在、以下のようなデータを入れてあります。

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

これで、

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

yes と答えると、データベースに反映されます。以下のようにデータは無事に残っています。まあこれくらい簡単なのならね…

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

とりあえず、面白そうなのでいろいろと試してみますかね。

個人的に、 Django で開発するときは、いきなり Model にかきまくって、どんどん変更していくような開発をしているので、大変便利なのではないかと思ってます。というか使います。

Posted at: 
2008/10/14 05:17:19
1 Comment
1 TrackBack
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2008/10/14/django_evolution/trackback/
この日記のはてなブックマーク数

TrackBacks

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


Stored evolutions
もうちょっとマニュアルを読んだので、 前回 の続きを書いてみます。前回は、
$ python manage.py evolve --hint --execute

で、実行しましたが、一旦ファイルに保存してから行う、 Stored evolutions という方法も試してみます。モデルを作って、変更するところまでは、まったく同じです。最初の syncdb を行

Created at: 
2008/10/15 04:31:35

Comments

Cole Jones

ほら、ベルルスコーニに対するイタリアのデモ集会

Created at: 
2011/12/11 10:31:45

Add Comment

Add Comment