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.6.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5226d8e665b848609b60932e3e7b8b7aab45c0a59db184fcf77c1eb0fff2ccc |
|
MD5 | 074b3d68bcb62e628d1cc12cf1ef3aae |
|
BLAKE2b-256 | 29c19b358beed2e5e6f5aabd8c06502adddbf43605fcfb76f16ccca5ebf08a13 |
Hashes for django_migration_resolver_hook-0.1.6-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2aca5cd64270586e8bdf19126fbf5c0bf77909d3807b7907c3ec7114463da761 |
|
MD5 | e45da729f497a4b1e353078614a83ab4 |
|
BLAKE2b-256 | c46dc43f16008077402e13e311f0d27fba3a7d82242c7fd633ab03a7fe3dc5f3 |