DjangoはRailsに比べると、Modelの変更とバージョン管理が甘いので
自分でルールを決めて管理していく必要があり、
方法も予め用意されたツールなどがあるわけではないので、
自分なりに方法を決めておくのが良い。
というわけでルール。
- カラム変更の前後でCOMMITし、追加内容をコメントに明記する。
- COMMITするのはDBに影響のある変更のみで、Modelにヘルパーメソッドを追加したとかは気にしない。
- 変更前に必ずmanage.pyダンプを取る。
ルールを守った感じで手順
manage.py dumpdata **** >****.json
上の****は、左がアプリ名、右は任意のファイル名だが拡張子は必ずjsonで
- models.pyを変更する
- 下記コマンドでDDLを実行し、データを戻す
manage.py reset ****
manage.py loaddata ****.json
上の****は上がアプリ名、下が上記でリダイレクト指定したファイル名
この手順だと既にデータ存在するテーブルへの非Nullフィールドの追加でエラーが発生する(ような予感が強い)。具体的にはloaddataのときに、NOTNULL制約に引っかかると思われる。
対策は、Model定義にdefaultを定義してやるといい。
model定義にdefaultを付けたくない場合は、既存のデータを犠牲にするとか、上記のresetコマンドやloaddataコマンドは使わずに、テンポラリテーブルを使って、データ戻しのSQLに細工して値を入れ込んでやるとか。
自分の場合は、modelを変更した後で、
manage.py sql ****
上の****はアプリ名。これで出したSQLをコピーしてALTER TABLE文を直接流し、その際defaultを付けとく。
んでもって、改めてdumpdataを取って、resetとloaddataを実行する。
最終更新:2012年12月03日 15:32