8
4

More than 1 year has passed since last update.

【Python Django】マイグレーション(DB)をロールバック、元に戻す

Last updated at Posted at 2021-09-16

Djangoはマイグレーションファイルからテーブルの定義変更や追加する機能がDjango ORマッパーにあります。さらに「ロールバック」つまり、マイグレーションファイルをもとにデータベースを前の定義に戻すこともできます。

用途としては、

  • チームで開発してて、migrateした後に「こっちに修正した方が良くない?」と言われたので修正必要
  • migrateしたけど、定義抜けてたからロールバック(戻して)定義追加し直したい

などに使えます。
ある程度Djangoで開発していくなら必須の知識ですね!

image.png

DjangoのDB・モデルの基礎は以下のように書いてますので良ければ

今回以下の記事のmodel定義を使用して記事作成しました。

マイグレーション履歴を確認

python manage.py showmigrations

マイグレーション履歴を確認できる。
どこに戻せばいいか、「アプリ名」、「マイグレーション名」を確認。

accounts
 [X] 0001_initial
 [X] 0002_order_product_tag
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

今回はaccountsアプリの0002_order_product_tagをロールバックにして元に戻すことにします。

ロールバックのコマンドはmigrate

rollbackみたいなコマンドはなくて、migrateコマンドにどこまで戻るかをマイグレーション名を入力することで行うことができます。

書き方は
python manage.py migrate <アプリ名> <マイグレーション名>

例:

python manage.py migrate accounts 0002_order_product_tag

で指定したマイグレーションまで戻る

マイグレーションファイルの修正や削除

先ほどのコマンドでロールバックすることができました。変更をなかったことにするなら、該当のマイグレーションファイルを削除すれば完了です。
もし定義を変更するなら

パターン1: modelを編集してmakemigrations

できればこれやった方が安全。
models.pyを編集してマイグレーションファイルを削除
今回は私の場合はaccounts/migrations/0002_order_product_tag.pyを削除ですね。

python manage.py makemigrations

でもう一度作成、

python manage.py migrate

これで完了。

パターン2: マイグレーションファイルを直接編集

知識ある場合に使ってください。
マイグレーションした時に、新規データを作成したり、既存のデータを変更・削除したいなどなど、特別な処理を記述する場合は該当ファイルを編集してください。

あとは、同じく

python manage.py makemigrations

でもう一度作成、

python manage.py migrate

全てを初期の状態に戻したい

たまに、まっさらな状態に戻したいということもあると思います。そんな場合は以下のコマンドを使用。

python manage.py migrate <アプリ名> zero

例:

python manage.py migrate apps zero
8
4
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
8
4