Resolve migration conflicts.
Project description
django-migration-resolver-hook
Django Migration resolver ensures that migration files always stays ordered regardless of remote changes.
Problem:
With generated migration files using Django's manage.py makemigrations
command you could run
into issues where the generated migration files would potentially be out of sync with
remote's master/default branch most CI servers are able to catch this error by running a test based on
your local branch merge back into the base branch there by spotting duplicate migration nodes.
Solution:
This package aims to solve this problem by using a Doubly Linked List while traversing the app's migration file(s) to store and detect duplicate node(s) and potential conflicts.
When duplicate nodes are detected stat.st_mtime
is used to sort files based on the last modified time.
:warning: This is not always accurate and might require a manual check to validate changes.
NOTE: This doesn't require Django's installed apps concept when using CLI commands since this is totally file based and should be executed within the root/app folders.
Table of Contents
Installation
$ pip install django-migration-resolver-hook
Poetry
poetry add -D django-migration-resolver-hook
Usage
Use Case
Remote
|--- migrations
|---- ...
|---- 0007_auto_20200112_2328.py # Shared between remote and local repo
|---- 0008_auto_20200113_4328.py # Only exists on remote
|---- 0009_auto_20200114_4532.py
|---- 0010_auto_20200115_1632.py
Local repo
|--- migrations
|---- ...
|---- 0007_auto_20200112_2328.py # Shared between remote and local repo
|---- 0008_auto_20200114_5438.py # Only exists locally which raises duplicate migration nodes errors.
Since this is now out of sync with the remote branch to sync changes:
Using Auto migration resolver
CLI command: auto_migration_resolver
Auto detect and fix migration files by providing the following:
--app-name
: The app_name of the Django application.--strategy
: The strategy used to resolve migration errors (options: "reseed"/"inline"). (Defaults to: "reseed")--exclude
: The list of migration files that should be ignored.--commit
: Perform agit commit
for the changes after moving file old -> new.--verbose
: Verbose command execution.
Usage:
$ auto_migration_resolver --app-name my_app --commit --verbose
Output
...
Using Static migration resolver
CLI command: migration_resolver
Fix migrations by providing the following:
--app-name
: The app_name of the Django application.--last
: Last migration file of the remote that should be the seed of the conflicted migrations with or without the suffix.--conflict
: The migration file which needs to be reseeded from the last migration file.--commit
: Perform agit commit
for the changes after moving file old -> new.--verbose
: Verbose command execution.
Usage:
$ migration_resolver --app-name my_app --last 0010_auto_20200115_1632 --conflict 0008_auto_20200114_5438 --commit --verbose
Output
Fixing migrations...
Updating the conflicting migration file 0008_auto_20200114_5438.py
Succefully updated: 0008_auto_20200114_5438.py.
Renaming the migration file from 0008_auto_20200114_5438.py to 0011_auto_20200114_5438.py
Successfully renamed the migration file.
[my-test-branch c18fca41e] Resolved migration conflicts for 0008_auto_20200114_5438.py → 0011_auto_20200114_5438.py
1 file changed, 1 insertion(+), 1 deletion(-)
rename my_app/migrations/{0008_auto_20200114_5438.py => 0011_auto_20200114_5438.py} (99%)
For more options
$ migration_resolver --help
usage: migration_resolver [-h] [--auto-detect] [--verbose] --app-name APP_NAME --last LAST --conflict CONFLICT [--commit]
Resolve duplicate migration nodes.
optional arguments:
-h, --help show this help message and exit
--auto-detect Auto-detect and fix migration errors. (Not supported)
--verbose Verbose output
--app-name APP_NAME App Name
--last LAST The glob/full name of the final migration file.
--conflict CONFLICT The glob/full name of the final migration file with the conflict.
--commit Commit the changes made.
Using vsc (git/mercurial) when the remote has a migration files that conflict with previous migrations you have locally.
TODO:
- Auto detect and resolve errors with migration nodes.
- Speed up execution using async/await for handling reading nodes.
- Add support for database unapply migration for case of applied migrations.
- Add support to rollback any changes if there are failures in the chain of operation.
- VCS support right now only git is supported (extend to mercurial).
- Document Auto migration strategies.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django-migration-resolver-hook-0.1.5.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 17e865b55eae5ac5dcc9b05250d65d90fdbb80c1c12061f31ad37fef3c9a406e |
|
MD5 | 896bf7a256e6273ce609f0e9c8c36323 |
|
BLAKE2b-256 | 8270a68b0139177f9b731982c556de9a5167b564396f4631b7d706195a355ca4 |
Hashes for django_migration_resolver_hook-0.1.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | db62bea8bfb82eeec48215b0a90d822c631ff4fd3922e3528cba6aa59aba45e9 |
|
MD5 | 0aab91c6545f042884abbc5af387e5e5 |
|
BLAKE2b-256 | a904981e6dda994e4ad8585b261450c704399390926f283ddfa83632c66f0727 |