Skip to content

Django zero migrations (reset migrations) command with backup feature

License

Notifications You must be signed in to change notification settings

aminiun/django-zeromigrations

Repository files navigation

Django Zero Migrations (Reset Migrations)

As the project grows up, the number of migration files increases over time. As a result, running them can consume a lot of time, specifically when you are running your tests.

zeromigrations is a command to reset migration files. It basically runs 4 commands:

  1. migrate --fake {app_name} zero for each app.
  2. Remove old migration files, as new migrations is going to be generated.
  3. makemigrations to generate initial migration file.
  4. migrate --fake-initial to fake generated initial files.

But besides that, this command can make a backup to restore in case of any failure.

Note that migrate --fake command only runs for your own apps and django apps like contenttype and third-party apps are excluded.


Installation

First install the package:

pip3 install django-zeromigrations

Then add it to your INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    "zero_migrations"
]

Usage

First, run the command:

python manage.py zeromigrations --backup-path=<YOUR_PATH>

I suggest to make a backups from both your migrations and django_migrations table (just in case).
1- make backup
2- restore last backup
3- just proceed

If you choose 1- make backup, it would make a backup then zero migrations.

If you choose 2- restore last backup, it tries to restore the latest backup that can be found. If not backup found, it would raise an error.

If you choose 3- just proceed, it assumes that you already have your own backup and start setting migrations zero.

Options

  • --backup-path: The absolute path of the dir that you want to store backups in. It should have --backup-path=<PATH> format. The default path is inside of zeromigrations app dir.
  • --use-fake-zero: By default, deleting migrations records from DB happens directly using ORM. With this flag, you can set to use python3 manage.py migrate app --fake zero (note that it has performance issue).