【Django】makemigrations/マイグレーションの取り消し

djangoのmodelsでテーブルを定義した後に、python manage.py makemigrations を実行し、python manage.py migrate を実行したところ、不穏なエラーが出て解決方法がわからずに、マイグレーションを一度取り消してテーブル定義からやり直したい時はありませんか?

本日はそんなマイグレーションの取り消し方法を紹介します。

エラー発生の経緯

まず改めてどのようなコマンドを実行してエラーに至ったのかを簡単に説明します。

テーブル定義後に以下のようにマイグレーションファイル作成のコマンドを実行しました。

$ python manage.py makemigrations

そして、以下のコマンドでmakemigrationsで生成されたファイルをデータベースに適用するコマンドを実行します。

$ python manage.py migrate

すると…

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
  Applying myapp.0004_auto_20210731_1557...Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
.

.
.
.
django.core.exceptions.ValidationError: ["'' は無効な形式の値です。 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 形式でなければなりません。"]

ほげええええええなんじゃこりゃああああ!!!

(ちなみにこのエラーの原因はmodels.DateTimeFieldに、default=””という引数を用いたためにエラーが発生しました。)

というわけで、うまくできなかったのでマイグレーションの取り消し実行することにします。

取り消す手順

手順としては

  1. 履歴を確認する
  2. その履歴箇所まで巻き戻す
  3. ファイルを物理的に削除する

という手順をふみます。

履歴を確認する

以下のコマンドでマイグレーションの履歴を確認します。

$ python manage.py showmigrations
myapp
 [X] 0001_initial
 [X] 0002_auto_20210613_1859
 [X] 0003_auto_20210717_1332
 [ ] 0004_auto_20210731_1557

上のうち、[X]のXがない[ ]となっている0004_auto_20210731_1557 という履歴がexecute(エグゼキュート)、つまりプログラミングでいうx(実行)がないことを意味しています。

python manage.py makemigrationsで必要なファイルは作成したけど、DBに設計図を流し込む(python manage.py migrate)ことはしていないということです。

migrateでロールバックする

履歴がわかったところで、ロールバックしていきます。

以下のコマンドを実行します。

$ python manage.py <アプリ名> <履歴>

つまり今回の場合、myappがアプリ名で、00~で始まる名前が履歴になります。

$ python manage.py showmigrations
myapp
 [X] 0001_initial
 [X] 0002_auto_20210613_1859
 [X] 0003_auto_20210717_1332
 [ ] 0004_auto_20210731_1557

つまり、以下のようにコマンドを実行します。

$ python manage.py migrate myapp 0003_auto_20210717_1332
Operations to perform:
  Target specific migration: 0003_auto_20210717_1332, from myapp
Running migrations:
  No migrations to apply.

このようになれば成功です。

マイグレーションファイルを削除する

物理的にファイルを削除します。

── migrations
             ├── 0001_initial.py
             ├── 0002_auto_20210613_1859.py
             ├── 0003_auto_20210717_1332.py
             └── 0004_auto_20210731_1557.py

今回の場合は、0004_auto_20210731_1557.pyというファイルを削除します。

確認のために、showmigrationsを実行してみます。

% python manage.py showmigrations
myapp
 [X] 0001_initial
 [X] 0002_auto_20210613_1859
 [X] 0003_auto_20210717_1332

以上。

最後に

いかがでしたでしょうか。

以上が「【Django】makemigrations/マイグレーションの取り消し」の紹介記事になります。

プログラミング学習を効率良く進めるには…

私ヒロヤンがプログラミングを始めた頃は以下のような感じでした。

何から手をつけていいのか、わからない。

プログラミングを始めてみたけど、エラーが解決できない。

そしてネットで調べていくうちに膨大な時間が過ぎていきました。

私ヒロヤンの実体験より、プログラミングを効率的に学ぶために大切なことは以下のことだと考えています。

1. いつまでもダラダラとやらないで、目標を決定して短期集中する

2. マンツーマンで、わからない箇所は直ぐに質問をして即レスをもらう

.proでは私ヒロヤンが学習してきたプログラミング経験0からのpython/django、その他webサイト・サービス開発のコースが用意されています。

カウンセリング自体は無料なので話を聞いてみるだけでもいかがでしょうか?

また以下のリンク先ではdjangoを教えてくれるスクールをまとめ紹介しています。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です