DjangoのMigrations操作の基本!ロールバック・取り消す方法

2020年5月26日

Python
Django
IT
SQL

Djangoのモデルを管理する

どうも、テック備忘LOGのYuki(@tech_bibo_log)です!!

今回はDjangoのモデルについての記事です。
モデルの修正を行いたい場合や、間違えてmakemigrationsしてしまった変更を取り消したい場合などに参考にしてください。

これから説明していくのは下記の3点です。

  • マイグレーションの履歴を確認する方法
  • ロールバックを行う方法
  • マイグレーションを取り消す方法


余談ですが、次の記事では当ブログを作成した時の手順について説明しています。

▽▽▽ Djangoでブログを構築した時のお話し ▽▽▽

2020/5/11

Django + Nginx + uWSGIな環境を構築する!「Hello, World」公開まで。


では早速やっていきましょう!!

[ 目次 (開く) ]

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__配下のキャッシュファイルも削除します。

/hogehoge/blog(アプリ名)/migrations/
...
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


以上で、マイグレーションのロールバックと取り消しは完了です。