Django migration を 切り戻す方法
Djangoでモデルをいじくっていると、DBがおかしくなって、migrateがいっこうに動かなくなることが多々あります
↓今回はこんなエラーでした
django.db.utils.OperationalError: foreign key mismatch - "〇〇" referencing "××"
「今日行った変更はいったん全部切り戻して、何事もなかったようにする!」の方法を紹介します
1. 特定のバージョン(?)にmigrateする
$ python manage.py makemigrations
を実行すると、
model.py のある app (例として今回は main というapp とします) の、migrations ディレクトリに、migrate用のpythonファイルが自動で作成されていきます
$ python manage.py makemigrations
Operations to perform:
Apply all migrations: admin, auth, contenttypes, main, sessions, users
Running migrations:
Applying main.0007_auto_20220106_2310... OK
$ ls -lA main/migrations/
合計 32
-rw-rw-r--. 1 user user 877 12月 23 22:56 0001_initial.py
-rw-rw-r--. 1 user user 621 12月 23 23:07 0002_auto_20211223_2307.py
...略...
-rw-rw-r--. 1 user user 1160 1月 6 23:10 0007_auto_20220106_2310.py
-rw-rw-r--. 1 user user 0 12月 23 22:28 __init__.py
drwxrwxr-x. 2 user user 4096 1月 6 23:10 __pycache__
このXXXX_〇〇〇_×××.py
をmigrate先に指定することができますので、
まずは一番最新のまだエラーが起こってない頃のバージョン(?)にmigrateします
コマンドは
$ python manage.py migrate app名 migrate先
です
$ python manage.py migrate main 0002_auto_20211223_2307
.py
は不要なので注意!
これでDBの中身は正常だったころの内容に戻ります
2. model.py を戻す
今日変更を行ったDBをおかしくしてしまうmodelは元に戻します
git 管理しているなら git checkout
でいいと思います
$ git checkout main/models.py
3. migrationsディレクトリのファイルを消す
今日出来たDBをおかしくしてしまうmigration 関連のファイルを削除しちゃいます
$ rm main/migrations/XXXX_〇〇〇_×××.py
4. 再度migrate処理
元に戻せたら、もう一回
$ python manage.py makemigrations
$ python manage.py migrate
を実行します
5. 完了
これでひとまず切り戻しが完了します
細かいことを考えず一気に戻しちゃいたいときは参考にしてみてください
無論、DBのデータは丁寧に扱うべきなので、むやみやたらに実行するのは避けたいですね
どうしようもなくなったときに実行するのがいいと思います
自分は個人で気楽に開発してるので、
エラーで詰まる時間がもったいないと感じちゃいます (というかめんどくさい)
こういう時はすぐ切り戻したり全部ぶっ壊して一からやり直すみたいなことすぐやっちゃいます
エラー解決能力が育たないのでよくないですね