モデル修正後のデータベースの更新

289 views
Skip to first unread message

de...@mars.dti.ne.jp

unread,
Jan 23, 2008, 6:51:13 AM1/23/08
to django-ja
PHP から移行してきました。一通りチュートリアルを読み終えたところのズブの初心者です。
CentOS5 python2.4 django 0.96.1 PostgreSQL 8.1 の環境で使用しています。

自作のモデルのメンバ変数を修正後、syncdb したのですが、修正したモデルのテーブルが更新されません。
いったんデータベースから直接テーブルを削除し、サイド syncdb するときちんと作成されます。
フィールド自体を変更するようなモデル修正を行った場合、どのようにすればデータベースに反映されるようになるのでしょうか。

以上、よろしくお願いします。

tsuyuki makoto

unread,
Jan 23, 2008, 9:44:31 AM1/23/08
to djan...@googlegroups.com
初めまして。
露木です。

今のところモデルの変更をDBに反映する機能は含まれていません。
ブランチが切られて開発はされていますが、バージョン1.0の時点で
実装を目指す一覧にも含まれておりませんので、本流に取り込まれる
時期は未定だと思います(方針さえもまだ確定はしていないっぽい)。
http://code.djangoproject.com/wiki/SchemaEvolution

08/01/23 に de...@mars.dti.ne.jp<de...@mars.dti.ne.jp> さんは書きました:

Yasushi Masuda

unread,
Jan 24, 2008, 12:36:37 AM1/24/08
to djan...@googlegroups.com
こんにちは。

露木さんが回答されたように、djangoは、モデルの変更に伴ってデータベースを
マイグレーションするためのインタフェースを備えていません。開発者たちは、
モデルレベルの変更がバックエンドDB上でどのような変更に対応するかを、DBに
依存しないやり方で実現するスマートな方法がないので、無理に組み込むのを
諦めているようです。

モデルを修正したあとで、テーブルのスキーマを更新させるには、いくつか方法があります。

[1] まずは、モデルの定義されているアプリケーションをリセットする方法です。
モデルが myapplication アプリで定義されているとして、以下のように実行します。

manage.py reset myapplication

ただしこれだと、myapplication で定義されているモデルに対応した全てのテーブルが
削除され、新しいモデル定義に従って再度生成されるので、それまでにアプリケーション
に投入したデータは失われてしまいます。

[2] データを一時退避して再度投入したければ、 fixture を使うとよいでしょう。

manage.py dumpdata myapplication

これで、 myapplication に投入されているデータが JSON 形式で書き出されます。
アプリケーションをリセットして、simplejson (djangoにバンドルされています)
でデータを読み出して投入するスクリプトを書けば、データをリストアできます。
JSON データを新たなモデルのスキーマに合わせて加工すれば、syncdbを使って
直接データを投入できます。

[3] もっと直接的には、ALTER TABLE を使って、DB上で直接テーブルスキーマを
変更します。とはいえ、DBのスキーマが正しくないと、起動時にモデルの検証が
できず、djangoが立ち上がらないと新たなモデルがDBのスキーマに正しく対応
しているのかわからないので、いささか骨の折れる作業だと思います。
(スマートにやっている人がいたら、やり方をぜひ教えてください)


de...@mars.dti.ne.jp さんは書きました:


--
Yasushi Masuda
http://ymasuda.jp/

deshi

unread,
Jan 25, 2008, 10:48:48 PM1/25/08
to django-ja
露木さん、Masuda さん、フォローありがとうございます。

そうですか…。モデル修正とデータベースのフィールドとの対応が難しいのはわかりますが、
単純なフィールドの追加と削除ぐらいは対応して欲しいですね…。
Masuda さんにご提案していただいた[2]の方法が一番現実的なので、そちらで考えて
いきたいと思います。
Reply all
Reply to author
Forward
0 new messages