Djangoはマイグレーションファイルからテーブルの定義変更や追加する機能がDjango ORマッパーにあります。さらに「ロールバック」つまり、マイグレーションファイルをもとにデータベースを前の定義に戻すこともできます。
用途としては、
- チームで開発してて、migrateした後に「こっちに修正した方が良くない?」と言われたので修正必要
- migrateしたけど、定義抜けてたからロールバック(戻して)定義追加し直したい
などに使えます。
ある程度Djangoで開発していくなら必須の知識ですね!
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