Skip to main content

Resolve migration errors

Project description

django migration fixer

PyPI Codacy Badge codecov Code style: black

Total alerts Language grade: Python Codacy Badge

Test Upload Python Package Run linters

PyPI - Python Version PyPI - Django Version Downloads

django-migration-fixer

Resolve django makemigrations multiple leaf nodes in the migration graph by ensuring that migration files and dependencies are always ordered regardless of remote changes.

Installation

$ pip install django-migration-fixer

Add migration_fixer to your INSTALLED_APPS

INSTALLED_APPS = [
    ...,
    "migration_fixer",
    ...,
]

Usage

$ python manage.py makemigrations --fix

By default this uses main as the default branch

Specifying a different default branch

Run:

$ python manage.py makemigrations -b master --fix

Github Actions

...
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.6.x'

      - name: Upgrade pip
        run: |
          pip install -U pip

      - name: Run django-migration-fixer
        uses: tj-django/django-migration-fixer@v1.0.1
        with:
          managepy-path: /path/to/manage.py

      - name: Verify Changed files
        uses: tj-actions/verify-changed-files@v7.1
        id: verify-changed-files
        with:
          files: |
             /path/to/migrations

      - name: Commit migration changes
        if: steps.verify-changed-files.outputs.files_changed == 'true'
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
          git add /path/to/migrations
          git commit -m "Update migrations"

      - name: Push migration changes
        if: steps.verify-changed-files.outputs.files_changed == 'true'
        uses: ad-m/github-push-action@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          branch: ${{ github.ref }}

Features

  • Maintain a consistent migration history when conflicts occur as a result of changes made using different versions of the default branch.
  • Resolve migration conflicts on PR branches
  • Resolve migration conflicts on the default branch (NOT RECOMMENDED)
  • Supports default migration modules i.e (0001_....py)
  • Supports named migration modules i.e (custom_migration.py)
  • Re-nummber all migrations using the last migration on the default branch i.e main or develop

Test Platforms

Example

Branch: main

├── app
│   ├── migrations
│   ├── 0001_initial.py
│   ├── 0002_auto_20210521_2328.py  

Branch: feature/test-a

├── app
│   ├── migrations
│   ├── 0001_initial.py
│   ├── 0002_auto_20210521_2328.py
│   ├── 0003_auto_20210522_1128.py 

Branch:feature/test-b

├── app
│   ├── migrations
│   ├── 0001_initial.py
│   ├── 0002_auto_20210521_2328.py
│   ├── 0003_auto_20210522_1228.py 

Both feature/test-a and feature/test-b share the last migration on main (0002_auto_20210521_2328.py)

Once feature/test-a is merged into main you run into the problem of resolving migrations on feature/test-b which was dependent on 0002_auto_20210521_2328.py

Branch: main

├── app
│   ├── migrations
│   ├── 0001_initial.py
│   ├── 0002_auto_20210521_2328.py
│   ├── 0003_auto_20210522_1128.py 

Branch: feature/test-b

├── app
│   ├── migrations
│   ├── 0001_initial.py
│   ├── 0002_auto_20210521_2328.py
│   ├── 0003_auto_20210522_1128.py \___________________ Both dependent on 0002_auto_20210521_2328.py
│   ├── 0003_auto_20210522_1228.py /

Running makemigrations fails with the following error:

CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0003_auto_20210522_1128, 0003_auto_20210522_1228 in app).
To fix them run 'python manage.py makemigrations --merge'

Using the --merge option creates a new migration file which might not be desired.

Solution

django-migration-fixer identifies changes between the default branch main, and the feature branch feature/test-b and maintains a consistent dependency history as shown below:

Branch: feature/test-b

├── app
│   ├── migrations
│   ├── 0001_initial.py
│   ├── 0002_auto_20210521_2328.py
│   ├── 0003_auto_20210522_1128.py
│   ├── 0004_auto_20210522_1228.py  # Renames: '0003_auto_20210522_1228.py' → '0004_auto_20210522_1228.py'

0004_auto_20210522_1228.py

...
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('app', '0003_auto_20210522_1128'),  # Replaced '0002_auto_20210521_2328' → '0003_auto_20210522_1128'
    ]

    operations = [
        ...
    ]

NOTE: :warning:

  • This also works when there are conflicts detected on the default branch.

    i.e You can run python manage.py makemigrations --fix on the main branch which relies on primitively picking the first migration file.

    e.g (0003_auto_20210522_1128, 0003_auto_20210522_1228 in app) would result in 0003_auto_20210522_1128.py being picked as the base migration which might not be accurate in every case and is not recommended.

Assumptions

The final migration on the default branch would be used as the base for all subsequent migrations.

Found a Bug?

To file a bug or submit a patch, please head over to django-migration-fixer on github.

If you feel generous and want to show some extra appreciation:

Support me with a :star:

Buy me a coffee

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-migration-fixer-1.0.2.tar.gz (12.4 kB view hashes)

Uploaded Source

Built Distribution

django_migration_fixer-1.0.2-py2.py3-none-any.whl (13.4 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page