今のところモデルの変更をDBに反映する機能は含まれていません。
ブランチが切られて開発はされていますが、バージョン1.0の時点で
実装を目指す一覧にも含まれておりませんので、本流に取り込まれる
時期は未定だと思います(方針さえもまだ確定はしていないっぽい)。
http://code.djangoproject.com/wiki/SchemaEvolution
08/01/23 に de...@mars.dti.ne.jp<de...@mars.dti.ne.jp> さんは書きました:
露木さんが回答されたように、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/