Modelの変更

DjangoはRailsに比べると、Modelの変更とバージョン管理が甘いので
自分でルールを決めて管理していく必要があり、
方法も予め用意されたツールなどがあるわけではないので、
自分なりに方法を決めておくのが良い。

というわけでルール。
  • カラム変更の前後でCOMMITし、追加内容をコメントに明記する。
  • COMMITするのはDBに影響のある変更のみで、Modelにヘルパーメソッドを追加したとかは気にしない。
  • 変更前に必ずmanage.pyダンプを取る。

ルールを守った感じで手順
  • COMMITする
  • 下記コマンドでダンプを取る
manage.py dumpdata **** >****.json
上の****は、左がアプリ名、右は任意のファイル名だが拡張子は必ずjsonで
  • models.pyを変更する
  • 下記コマンドでDDLを実行し、データを戻す
manage.py reset ****
manage.py loaddata ****.json
上の****は上がアプリ名、下が上記でリダイレクト指定したファイル名
  • 上手くいったら、COMMIT

この手順だと既にデータ存在するテーブルへの非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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。