こんにちは。

露木さんが回答されたように、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のスキーマに正しく対応
しているのかわからないので、いささか骨の折れる作業だと思います。
(スマートにやっている人がいたら、やり方をぜひ教えてください)


[メールアドレス保護] 
さんは書きました:
> PHP から移行してきました。一通りチュートリアルを読み終えたところのズブの初心者です。
> CentOS5 python2.4 django 0.96.1 PostgreSQL 8.1 の環境で使用しています。
> 
> 自作のモデルのメンバ変数を修正後、syncdb したのですが、修正したモデルのテーブルが更新されません。
> いったんデータベースから直接テーブルを削除し、サイド syncdb するときちんと作成されます。
> フィールド自体を変更するようなモデル修正を行った場合、どのようにすればデータベースに反映されるようになるのでしょうか。
> 
> 以上、よろしくお願いします。
> > 
> 


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


--~--~---------~--~----~------------~-------~--~----~
-----------------                       http://www.djangoproject.jp/            
             -----------------
You received this message because you are subscribed to the Google Groups 
"django-ja" group.
To post to this group, send email to django-ja@googlegroups.com
To unsubscribe from this group, send email to 
[メールアドレス保護]
For more options, visit this group at http://groups.google.com/group/django-ja
-~----------~----~----~----~------~----~------~--~---

  • ... [メールアドレス保護]
    • ... tsuyuki makoto
    • ... Yasushi Masuda

メールによる返信