0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Django】migration を 切り戻す方法

Last updated at Posted at 2022-01-06

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のデータは丁寧に扱うべきなので、むやみやたらに実行するのは避けたいですね
どうしようもなくなったときに実行するのがいいと思います

自分は個人で気楽に開発してるので、
エラーで詰まる時間がもったいないと感じちゃいます (というかめんどくさい)
こういう時はすぐ切り戻したり全部ぶっ壊して一からやり直すみたいなことすぐやっちゃいます
エラー解決能力が育たないのでよくないですね

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?