DjangoのMigrations操作の基本!ロールバック・取り消す方法
2020年5月26日
Djangoのモデルを管理する
どうも、テック備忘LOGのYuki(@tech_bibo_log)です!!
今回はDjangoのモデルについての記事です。
モデルの修正を行いたい場合や、間違えてmakemigrations
してしまった変更を取り消したい場合などに参考にしてください。
これから説明していくのは下記の3点です。
- マイグレーションの履歴を確認する方法
- ロールバックを行う方法
- マイグレーションを取り消す方法
余談ですが、次の記事では当ブログを作成した時の手順について説明しています。
▽▽▽ Djangoでブログを構築した時のお話し ▽▽▽
2020/5/11
Django + Nginx + uWSGIな環境を構築する!「Hello, World」公開まで。
Djangoでブログを構築した際の実際の手順をコマンドを交えて分かりやすく紹介しています。
yuki-yamashita.site/blog/post/django-blog/
では早速やっていきましょう!!
[ 目次 (開く) ]
Migrationsの現状を把握
マイグレーションの履歴を確認したいときや、変更したモデルのMigrations処理が残っていないかの確認は、次のコマンドで方法で行います。
今回はブログアプリのマイグレーションをロールバックさせるという想定で進めていきます。
1.未適用のMigrationsを確認する方法(その1)
1つ目はmakemigrations
コマンドで、モデルの変更からマイグレーションファイルが作成されているか確認する方法です。
# python3 manage.py makemigrations
No changes detected
『No changes detected』が表示されていればModelの修正がすべてマイグレーションファイルに出力されています。
2.未適用のMigrationsを確認する方法(その2)
2つ目はshowmigrations
コマンドで、Modelの変更がDBに適用されているか確認する方法です。
# python3 manage.py showmigrations blog
blog ← アプリケーション名 [X] 0001_initial ← マイグレーション名 [X] 0002_post_image [X] 0003_contentimage [X] 0004_auto_20200507_2355 [X] 0005_post_relation_posts [X] 0006_auto_20200512_0101 [X] 0007_auto_20200514_0225 [ ] 0008_auto_20200521_2345 [ ] 0009_auto_20200522_0025
この場合、makemigrations
で作成された最後の2つ分のマイグレーションがまだDBに適用されていません。
・0008_auto_20200521_2345
・0009_auto_20200522_0025
Migrationのロールバックと取り消しについて
これまでのマイグレーションをロールバックまた、取り消したい場合は下記の手順で行うことができます。
1.マイグレーションの履歴を確認しよう!
まずはshowmigrations
コマンドで、マイグレーションの履歴を確認しましょう。
# python3 manage.py showmigrations blog
blog ← アプリケーション名 [X] 0001_initial ← マイグレーション名 [X] 0002_post_image [X] 0003_contentimage [X] 0004_auto_20200507_2355 [X] 0005_post_relation_posts [X] 0006_auto_20200512_0101 [X] 0007_auto_20200514_0225 [X] 0008_auto_20200521_2345 [X] 0009_auto_20200522_0025
この場合、0009_auto_20200522_0025
まで全ての変更内容がDBに適用されています。
今回は0006_auto_20200512_0101
まで戻したいのでメモしておきます。
2.ロールバックしよう!
ロールバックを行う時はmigrate
コマンドを使用します。
先ほどメモしておいた遡りたいマイグレーション名を指定し、migrateコマンドを実行します。
そして、再度showmigrations
コマンドで確認すると、指定したマイグレーションに戻っていることがわかります。
# python3 manage.py migrate blog 0006_auto_20200512_0101 ← ロールバック処理
# python3 manage.py showmigrations
blog ← アプリケーション名 [X] 0001_initial ← マイグレーション名 [X] 0002_post_image [X] 0003_contentimage [X] 0004_auto_20200507_2355 [X] 0005_post_relation_posts [X] 0006_auto_20200512_0101 ← ここに戻ってきた [ ] 0007_auto_20200514_0225 [ ] 0008_auto_20200521_2345 [ ] 0009_auto_20200522_0025
3.マイグレーションファイルの削除
ロールバックを行った後や、不要になったマイグレーションファイルは消してしまいましょう。
マイグレーションファイルは/blog(アプリケーション名)/migrations/
配下にあります。
__pycache__
配下のキャッシュファイルも削除します。
... blog(アプリ名) ├── migrations │ ├── 0001_initial.py │ ├── 0002_post_image.py │ ├── ... │ ├── 0007_auto_20200514_0225.py ← 削除 │ ├── 0008_auto_20200521_2345.py ← 削除 │ ├── 0009_auto_20200522_0025.py ← 削除 │ ├── init.py │ └── pycache │ ├── 0001_initial.cpython-37.pyc │ ├── ... │ ├── 0007_auto_20200514_0225.cpython-37.pyc ← 削除 │ ├── 0008_auto_20200521_2345.cpython-37.pyc ← 削除 │ ├── 0009_auto_20200522_0025.cpython-37.pyc ← 削除 │ └── init.cpython-37.pyc ...
さいごに、もう一度確認しておきましょう。
# python3 manage.py makemigrations
# No changes detected
以上で、マイグレーションのロールバックと取り消しは完了です。