# django-replace-migrations
This package is an extension to djangos makemigrations.py. It can be used to get rid of old migrations as an alternative to djangos squashmigration command.
## Reasoning
In big django projects, migration files easily pile up and get an increasing problem. Django comes with the squashmigration command - however, it is hard to handle because of multiple reasons. Especially, it can not handle circular dependencies - they must be resolved [manually and with great care](https://stackoverflow.com/questions/37711402/circular-dependency-when-squashing-django-migrations).
One possible solution is to:
Delete all existing migrations
Run ./manage.py makemigrations, so that it creates new initial migrations
Run ./manage.py migrate –fake [new migrations] or ./manage.py migrate –fake-initail on all servers.
This workflow might work fine, if you have only few (production) servers - however, it becomes hard, when you have many environments with different versions of your application.
With django-replace-migrations also creates new initial migrations, but also, additionally, adds the already existing migrations to the replace list of the new migration (That list is used by squashmigrations as well). By doing that, faking migrations is not needed anymore.
## Warning
The new replacing migrations will not consider any RunPython or RunSQL operations. That might be acceptable depending on your use of those operations and if you need those to prepare a fresh database.
## Installation
Run
` pip install django-replace-migrations `
and add django_replace_migrations to your list of installed apps.
## Simple Workflow
If your apps are not depending on each other, you can use django-replace-migrations like this:
` ./manage.py makemigratons --replace-all --name replace [app1, app2, ...] ` Note, that you will need to [list all of your apps](https://stackoverflow.com/questions/4111244/get-a-list-of-all-installed-applications-in-django-and-their-attributes) explicitly - otherwise django will also try to replace migrations from dependencies. While –name could be omitted, it is highly recommended to use it so that you can easily recognize the new migrations.
If for any of your apps there are not one but two or more migrations created, your apps are depending on each other (see below).
You can leave your old migrations in the codebase. Old versions will continue to use the old migrations, while fresh installations will use the newly created replace migration instead.
If you remove the old migrations later, you will need to update the dependencies in your other migrations and replace all occurrences of the old migration with the new replace migration. You can easily do that with try-and-error (migrate will fail and tell you which dependency is missing)
## Workflow for depending apps
Due to the way django resolves the replace list, it can not handle circular dependencies within apps. To prevent an error during migration, you must delete the old migrations that you replaced.
If you have your application deployed on multiple servers, you must define down to which version, you will support upgrading and only replace those migrations.
Let’s assume that our current version of the application is 3.0 and we want to get rid of all migrations prior to 2.0.
The workflow for this would be:
git checkout 2.0
create a new branch git checkout -b 2-0-delete-migrations
[delete all existing migrations in your apps](https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html)
commit and note the commit hash
git checkout 2.0
create a new branch git checkout -b 2-0-replace-migrations
run ./manage.py makemigrations –replace-all –name replace_2_0 [app1, app2, …] ([How to get all apps](https://stackoverflow.com/questions/4111244/get-a-list-of-all-installed-applications-in-django-and-their-attributes))
commit and note the commit hash
git checkout [your main/feature branch]
git cherry-pick [commit-hash from 2-0-delete-migrations]
git cherry-pick [commit-hash from 2-0-replace-migrations]
Now you have all migrations prior to 2.0 removed and replaced with new migrations.
That means that:
Server database is prior 2.0 -> Migrations will not work
Server database is after 2.0 -> Newly created replacement migrations will not run because all migrations they replace are already applied
Server database is fresh -> Newly created replacement migrations will run.
## makemigration.py compatibility
This package requires deep integration into makemigrations.py so that I needed to copy the whole makemigrations.py here. Currently the version of makemigrations.py is copied from Django 2.1, however it is also tested with Django 3.0 and works there as well. If you encounter problems, please write what version of Django you are using.
Metadata
Release files for django-replace-migrations 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| django-replace-migrations-0.0.2.tar.gz | 8.3 kB | Without provenance | Details for django-replace-migrations-0.0.2.tar.gz |
Release files / django-replace-migrations-0.0.2.tar.gz
| Download URL | django-replace-migrations-0.0.2.tar.gz |
|---|---|
| Size | 8.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9f329f8abab74e27c1930c925c04b11546d245503775c5b47a5119867909e2e1
|
|
BLAKE2b-256 checksum How to use checksums |
d5fd447cb535ab0fe6dacdb76746442d7d378c7df9b82672f4994167368d87ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.6.1 requests/2.25.0 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.6
|
Security for django-replace-migrations 0.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.