3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Django のマイグレーション漏れを CI で自動検出する方法

3
Last updated at Posted at 2026-03-12

はじめに

モデルの管理画面での表示名を変更した際に、マイグレーションファイルを作成し忘れてしまいました(;_;)

前回の記事でマイグレーションについて調べたことをまとめています🥦

今回は、CI で自動的にマイグレーション漏れを検出する方法を紹介します。

💡 この記事でわかること

  • makemigrations --check の使い方と動作
  • GitHub Actions でマイグレーション漏れを自動検出する方法

GitHub Actions に組み込む

既存の CI ワークフローに、マイグレーションファイルの有無を確認するステップを追加します。

steps:
  # ... セットアップ省略 ...
  - name: Check Missing Migrations
    run: |
      python manage.py makemigrations --check
  - name: Run Migrations
    run: |
      python manage.py migrate

マイグレーション漏れがある状態で migrate を実行しても正しく適用されないため、マイグレーションの前にマイグレーションファイルの確認をするようにします。

makemigrations --check

Django の makemigrations コマンドには --check オプションで、モデルの変更に対応するマイグレーションファイルが作成されているかを確認することができます。

python manage.py makemigrations --check
  • マイグレーションファイル未作成のモデル変更があると検出され、エラーで終了する
  • Django 4.2.9 以降では --check でファイルは作成されないので、--dry-run は必要ない

✍️ 補足

Django 4.2.9 より前のバージョンでは、--check を付けてもマイグレーションファイルが作成されてしまう挙動がありました。CI で使用する場合は --dry-run を付けてファイルが作成されないようにする必要があります。

# Django 4.2.9 未満の場合
python manage.py makemigrations --check --dry-run

動作確認

ローカルでの確認

Docker コンテナ内で makemigrations --check を実行し、2つのケースを確認しました。

マイグレーション漏れがある状態:

未作成のマイグレーションの内容が表示され、エラーで終了します。

$ python manage.py makemigrations --check
Migrations for 'sales':
  apps/sales/migrations/0003_alter_csvexport_options_and_more.py
    - Change Meta options on csvexport
    - Alter field csv_export on product
  • Migrations for 'sales':対象のアプリ名
  • 0003_alter_csvexport_options_and_more.py:生成されるマイグレーションファイル名
  • Change Meta options on csvexport:Meta オプション(verbose_name 等)の変更
  • Alter field csv_export on product:フィールドの変更

マイグレーション漏れがない状態:

問題がなければ No changes detected と表示され、正常終了します。

$ python manage.py makemigrations --check
No changes detected

CI での確認

ローカルで問題なかったので、実際に GitHub Actions で動作するか確認しました。

  1. モデルに一時的な変更を加え、マイグレーションファイルは作らずにコミット・プッシュして PR を作成
  2. CI が Check Missing Migrations ステップで失敗 → 検出が機能していることを確認
  3. 一時的な変更を元に戻してコミット・プッシュ
  4. CI が成功 → 正常系も問題ないことを確認

他のアプローチ

pre-commit フックでの検出

Johnny Metz の記事 では、pre-commit フレームワークを使った方法が紹介されています。

# .pre-commit-config.yaml
repos:
  - repo: local
    hooks:
      - id: check-django-migrations
        name: Check django migrations
        entry: python manage.py makemigrations --check
        language: system
        types: [python]
        pass_filenames: false

コミット時にローカルで検出できるため、push 前に気づくことができます。

まとめ

  • makemigrations --check でマイグレーションファイルの漏れが確認できる
  • CI ワークフローでマイグレーションファイルの漏れを自動検出できる
  • pre-commit では push 前にマイグレーションファイルの漏れを自動検出できる

参考

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?