0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Django】カラム追加とか色々やったあとにテーブル(モデル)を作り直してマイグレーションファイルをきれいにする手順

Last updated at Posted at 2022-05-25

初期開発してて、とりあえず思いつきでモデル作成して、その後に「このカラムも必要」、「あれも必要」ってしたとき、マイグレーションファイルが増えちゃってきれいにしたいときの処方箋です。

 $ 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

これで幸せになれるんじゃないかなと思ってます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?