Skip to main content

A migration squasher that doesn't care how Humpty Dumpty was put together.

Project description

Supported PyPi Version Supported Python versions Supported Django versions Coverage PyPI - Downloads

django-squash

“django-squash” is a migration enhancement built on top of Django’s standard migration classes. It aims to eliminate bloat and slowness in migration processes by replacing certain commands. The vision and architecture of Django migrations remain unchanged.

Before using “django-squash,” it’s important to understand the normal Django makemigrations and squashmigrations commands. Migration files consist of operations that may or may not affect the database table for a model. “elidable” operations can be eliminated when squashing migrations, while “non-elidable” operations cannot. Best way to think about the word “elidable” is to simply think “forgetable” or “disgardable” – can this operation be disgarded once it’s been ran?

The package introduces a command named squash_migrations as an alternative to Django’s squashmigrations. This command minimizes the number of operations needed to build the database’s schema, resulting in faster testing pipelines and deployments, especially in scenarios with multiple tenants.

The catch lies in proper usage of elidable vs. non-elidable operations and the requirement that databases must not fall behind to the point where eliminated migration operations are needed. The squash_migrations command removes all elidable operations and preserves non-elidable ones.

It’s crucial to run the squash_migrations command once per release after cutting the release. All databases must be on the current release, the prior release, or somewhere in between. Databases before the prior release cannot directly upgrade to the current release; they must first apply the prior release’s migrations and then the current release’s minimal operations.

This approach is not a tutorial on migration strategy but emphasizes the need for understanding multi-app systems, avoiding circular dependencies, and designing efficient migration processes. The tool is developed based on experience and frustration, aiming to automate and improve the migration squashing process.

You can read more about our motivation to creating this tool.

Setup

  1. pip install django-squash

  2. Add django_squash to your INSTALLED_APPS.

    (optional) There are some settings you can customize

  3. Run ./manage.py squash_migrations once after each release

  4. Profit!

Developing

  1. clone the repo

  2. cd into repo

  3. (optional) run inside docker environment that way you can change the python version quickly and iterate faster

docker run --rm -it -v .:/app -v django-squash-pip-cache:/root/.cache/pip -e PYTHONDONTWRITEBYTECODE=1 python:3.12 bash -c "cd app; pip install -e .[test,lint]; echo \"alias linters=\\\"echo '> isort'; isort .; echo '> black'; black .; echo '> ruff'; ruff check .;echo '> flake8'; flake8 .; echo '> rst-lint'; rst-lint README.rst docs/*\\\"\" >> ~/.bash_profile; printf '\n\n\nrun **pytest** to run tests, **linters** to run linters\n\n'; exec bash --init-file ~/.bash_profile"

Alternatively, you can also create a virtual environment and run

python3 -m venv venv
source venv/bin/activate
pip install -e '.[test]'
  1. Run tests

pytest
  1. Before making a commit, make sure that the formatter and linter tools do not detect any issues.

ruff check --fix --extend-select I .
ruff format .
rst-lint .

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_squash-0.0.15.tar.gz (27.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_squash-0.0.15-py3-none-any.whl (20.4 kB view details)

Uploaded Python 3

File details

Details for the file django_squash-0.0.15.tar.gz.

File metadata

  • Download URL: django_squash-0.0.15.tar.gz
  • Upload date:
  • Size: 27.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for django_squash-0.0.15.tar.gz
Algorithm Hash digest
SHA256 57d01d33cc6c0402656e0e31626d225bd3e6be4c1634e66b63e23c8609da03b5
MD5 fc54db640a6540de70ed2d5f2ec69b0c
BLAKE2b-256 a328231fc27943bbaa90d5dc9ddbf959b4e8d1fe0229570e9d167e21a0f7387f

See more details on using hashes here.

File details

Details for the file django_squash-0.0.15-py3-none-any.whl.

File metadata

  • Download URL: django_squash-0.0.15-py3-none-any.whl
  • Upload date:
  • Size: 20.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for django_squash-0.0.15-py3-none-any.whl
Algorithm Hash digest
SHA256 c88d4ec31f9af668ceccd718993ab5b0e9f4cf558ad75e4d244453a56b4645de
MD5 501b7a3100b300978319f4cb9d521b82
BLAKE2b-256 9a3f8ecf7140c8f67e184e6539a8d0553cbb65ea8e2953d7fd836018561f81b2

See more details on using hashes here.

Supported by

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