CLI to compare Django migrations between two snapshots.
This may be useful when you need to compare migrations in the same app between different branches.
pip install django-migrations-diff
- Python 3.6 or higher
# show help
mdiff help
# Create migrations snapshot
mdiff <snapshot>
# Compare two snapshots
mdiff <snapshot_1> <snapshot_2>
# Compare two snapshots (get number of diffent migrations)
mdiff <snapshot_1> <snapshot_2> --number
# List of all snapshots
mdiff list
# Remove all or specific snapshots
mdiff rm all
mdiff rm <snapshot_1> <snapshot_2>
# Get current version
mdiff -v
For example, you need to compare "master" and "develop" branches.
git checkout master # go to "master" branch
mdiff master # create "master" snapshot
git checkout develop # go to "develop" branch
mdiff develop # create "develop" shapshot
mdiff master develop # compare two snapshots
Output will be like:
┌─────────────┬───────────────────┬───────────────────┐
│ APPLICATION │ MASTER │ DEVELOP │
├─────────────┼───────────────────┼───────────────────┤
│ app.authors │ 0004_migration.py │ --- │
│ │ --- │ 0005_migration.py │
├─────────────┼───────────────────┼───────────────────┤
│ app.users │ 0003_migration.py │ 0003_migration.py │
└─────────────┴───────────────────┴───────────────────┘
Stats for snapshot DEVELOP: +1 -1 *1
Explanation:
- Snapshot MASTER has 0004_migration.py but DEVELOP misses it
- Snapshot DEVELOP has 0005_migration.py but MASTER misses it
- Both MASTER and DEVELOP have 0003_migration.py migration, but it differs inside
- Stats show that DEVELOP snapshot has 1 new, 1 missing and 1 changed migration
This package also can be used to detect new migrations in CI/CD pipelines. For example, following stage in .gitlab-ci.yml will fail if there are new migrations in current branch in comparison to master branch.
chechcheck:
stage: tests
script:
- pip install django-migrations-diff==2.0.4 # PLEASE, CHECK CURRENT VERSION
- git merge-base origin/master HEAD | xargs git checkout
- mdiff master
- git checkout ${CI_COMMIT_REF_NAME}
- mdiff ${CI_COMMIT_REF_NAME}
- mdiff master ${CI_COMMIT_REF_NAME}
- (if [[ $(mdiff master ${CI_COMMIT_REF_NAME} --number) == 0 ]]; then echo "No new migrations"; else exit 1; fi;)
allow_failure: true
NOTE: This is not full stage descriptions, this is only example.