Python

【TIPS】Djangoモデルを過去マイグレーションまでロールバックして元に戻す方法

 

エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。

 

普段はフリーランスでシステムエンジニアをしております。

 

今回は、PythonのDjangoのモデルを過去のマイグレーションまでロールバックして元に戻す手順をまとめてみました。

 

Djangoでの開発するためにVisual Studio Code (VS Code) を使用しているため、同様に確認したい方は、こちらの記事でVS CodeでPythonの開発環境を構築してみてください。

 

 

Djangoのモデルとは(おさらい)

 

Djangoのモデルとは、Django上でデータベースのテーブルやフィールドを定義するものです。

 

Djangoのモデルからデータベースのテーブルやフィールドを定義する部分を図式化すると、下図のようになります。

 

 

Djangoのコマンドによって、models.pyからマイグレーションファイル(中間のデータベース設計図)を作成し、実際のデータベースへ反映させるという仕組みになっています。

 

下図は、実際にVSCode上でmodels.pyから中間の設計図を作成後、データベースへ反映させたときの状態です。

 

 

これでDjangoのモデルの全体像がわかったかと思います。

 

 

Djangoのモデルのマイグレーション履歴を確認(showmigrations)

 

Djangoのモデルをロールバックさせるには、モデルの過去のマイグレーション履歴を把握しておく必要があります。

 

Djangoのモデルのマイグレーション履歴を確認するには、以下のshowmigrationsコマンドを実行します。

 

【コマンド書式】

 

 

【コマンド結果】

 

 

上図からDjangoアプリ「app」には、以下の3つのマイグレーション履歴があることがわかります。

 

  • 「0001_initial」
  • 「0002_itemmodel_item_description」
  • 「0003_itemmodel_item_value」

 

マイグレーション名の左にある[X]は、マイグレーションが適用されていることを意味します。

 

つまり、上図では過去3つのマイグレーション履歴がすべて反映されている状態を示しています。

 

 

Djangoのモデルを過去のマイグレーションへロールバック(migrate)

 

Djangoのモデルのマイグレーション履歴がわかったところで、次はロールバックをする方法を紹介します。

 

Djangoのモデルを過去のマイグレーションへロールバックするには、以下のmigrateコマンドを実行します。

 

【コマンド書式】

 

migrateコマンドに含まれる<Djangoアプリ名>と<マイグレーション名>については、前述で調べたマイグレーション履歴から選択します。

 

 

 

【コマンド例】

 

Djangoアプリ「app」で定義したモデルを「0001_initial」という設計図の履歴までロールバックしている例です。

 

 

【コマンド結果】

 

showmigrationsコマンドで再度マイグレーション履歴を確認してみましょう。

 

 

0002と0003には、[ ]のようにXがなくなっており、0001にロールバックできていることがわかります。

 

 

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

 

0001までロールバックできたことが確認できましたら、下図の赤枠に示す0002と0003のマイグレーションファイル(中間の設計図)、およびキャッシュファイルを削除しましょう。

 

 

これでDjangoのモデルを過去のマイグレーションまでロールバックする方法は以上です。

 

0002と0003の設計図が残ったまま、再度「python manage.py migrate」コマンドでマイグレーションを実行すると、0003まで適用した状態に戻ってしまいます。

 

 

完全に初期化する方法(zero)

 

次は、「0001_initial」のマイグレーション以前まで初期化するには、以下のように<マイグレーション名>に「zero」を指定します。

 

【コマンド書式】

 

 

【コマンド結果】

 

 

0001~0003には、[ ]のようにXがなくなっており、0001以前までロールバックできていることがわかります。

 

 

まとめ

 

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

 

Djangoに限らずデータベースの作成、更新、削除等の操作は、システム全体に影響するものです。

 

そのため、データベースの操作を誤ってしてしまった場合の対処方法は、エンジニアとして必ずおさえておく必要がありますので、本記事を参考にしてもらえたらと思います。

 

【関連記事】

【Python Django入門】使い方からWebアプリ作成までの流れ

【TIPS】Django RestFramework(DRF)のAPIサーバ開発手順と動作確認方法