初期開発してて、とりあえず思いつきでモデル作成して、その後に「このカラムも必要」、「あれも必要」ってしたとき、マイグレーションファイルが増えちゃってきれいにしたいときの処方箋です。
$ python manage.py showmigrations app_name
app_name
[X] 0001_initial
[X] がついているのはマイグレーション実行済みってことですね。
これで現在のマイグレーション状況を確認できます。これは別に叩かなくてもいいです。
app_nameを省略するとすべてのアプリケーションが対象になります。
今までのマイグレーションをなかったことにする。
python manage.py migrate <app_name> zero
zeroにします。
これを叩くと、app_nameに関連するマイグレーションがなかったことになります。
具体何が起こるかというと、
- app_nameに関連するテーブルがデータベースから消えます(DROP)
- django_migrationsっていうマイグレーションを管理しているテーブルからapp_name関連で行ったマイグレーションのレコードが消えます
これで完了かと思うとまだです。
マイグレーションファイルはまだ残っているのでこれを消します。
ちなみにこの状態でshowmigrationsを叩くと、
$ python manage.py showmigrations app_name
app_name
[ ] 0001_initial
を叩くと、こうなります。
このことから、
0001_initialの部分はマイグレーションファイルがあるか否かで表示している。
加えて、django_migrationsのテーブルの中に0001_initialがあったら[X]がつく。
みたいな感じと推測できます。
マイグレーションファイルの削除
find app_name/migrations -type file | grep -v -E '__init__.py' | xargs rm -rf
これで完了です。
※ubuntuとかの環境の場合、
find app_name/migrations -type f | grep -v -E '__init__.py' | xargs rm -rf
じゃないと怒られるかもしれません。
もし、 -type fileをつけ忘れてしまうと、migrationsのディレクトリが消えてしまって、makemigrationsが叩けなくなります。
そうなったら自分でmigrationsディレクトリを作って__init__.pyを作らないといけないです。
なんでこんなことわざわざ言ってるのかというとお察しの通りです。
以上です
誰かのお役に立てばさいわいです。
ちなみにこの記事を見てる方の半分くらいはもしかすると、
python manage.py squashmigrations
これで幸せになれるんじゃないかなと思ってます。