gdる!プログラマー

プログラミングを主に書いていきたい!まあ、備忘録です。

Django South --fakeオプションの使い道がようやくわかった

SouthでDBのマイグレートを行う際、--fakeオプションを付けると実際のテーブルに変更を

行わず、マイグレート履歴のみが更新されます。

具体的には、Djangoで指定したバックエンドDBに作成されるsouth_migrationhistoryテーブル

にマイグレート履歴のレコード0001_initial~000X_hogehogeがinsertされます。

 

このオプションが使えるケース(多分使い道の一つ)

  1. 新しくチームに加わった人のために既存のDjangoプロジェクトを構築してあげよう
  2. マイグレート実行
  3. アプリのモデル変更がやたら多い + ForeignKeyが入り乱れておりマイグレートエラー
  4. もうだめぽ

 

解決策

  1. エラーが出たアプリのテーブルを全drop(制約系ももちろん全消し)
  2. south_migrationhistoryテーブルのアプリのマイグレーション履歴をdelete
  3. Django内 フォルダツリ ーでアプリのフォルダに存在する、migrationsフォルダ内の マイグレーションファイル 000X_XXXX.pyを全て削除します。削除したマイグレーションファイルは後で戻すのでgitやらsubversionやらで管理していない場合は適当な場所に退避させておきましょう。
  4. schamamigrationコマンドを--initialオプション付きで実行します。これにより、migrationsフォルダに0001_initial.pyが作成されます。
  5. マイグレートします。これはまずエラーにならず成功します。
  6. 3で削除したマイグレーションファイルを復元します。(0001_initial.pyも元の内容に復元)
  7. --fake オプション付きでマイグレート実行します。

 

これにより、エラーを回避しつつマイグレート履歴も合わせることができます。

0001_initial.pyのファイル名だけは固定なことを利用した小技です。

環境構築時のマイグレーションでエラーになるとモチベーションがガタ落ちするのでさくっと解決しましょう♪