MongoMig
Alembic-style schema evolution and migrations for MongoDB.
Change your models, see exactly what changed, generate a migration, review its impact, and run it safely. Built for Python services (FastAPI, Flask, workers) on PyMongo or Beanie.
$ mongomig diff
USERS
+ status: string = 'active' REQUIRES_DATA_MIGRATION backfill existing documents with 'active'
+ age: int | null = None SAFE defaults to None: existing documents need no backfill
+ given_name: string MANUAL_REVIEW required, with no default: choose a value for existing documents
- first_name WARNING removed from the model; existing data is kept (not deleted)
+ index users_email_unique (email ↑, unique) WARNING fails if existing documents contain duplicates
Possible rename: users.first_name → given_name (85% similar). If so, pass --rename users.first_name:given_name
$ mongomig revision --autogenerate -m "evolve users" --rename users.first_name:given_name
Generated b91baf4fd592 → migrations/versions/20260925_1115_b91baf4fd592_evolve_users.py
$ mongomig plan
b91baf4fd592 evolve users Risk: HIGH
users rename_field $rename first_name ~4,218,901 docs · collection scan
users backfill $set status ~4,218,901 docs · collection scan
users create_index users_email_unique (unique) 4,218,901 docs
⚠ will fail: duplicate values exist, e.g. {'email': 'sam@example.com'}
$ mongomig upgrade
Why MongoMig
- Autogenerate from your models: plain Pydantic (
@collection) or Beanie documents, no extra declarations. Backfills with your defaults, renames, indexes,$jsonSchemavalidators. - Every change is classified: SAFE, WARNING, REQUIRES_DATA_MIGRATION or MANUAL_REVIEW.
Risky changes become commented
TODO(review)blocks, and data is never deleted automatically. - Deterministic diffs: models are compared with a committed schema snapshot rather than a sampled database, so results are the same on every machine and in CI.
- Knows how you store data:
model_dump()vsjsonable_encoderstores dates as different BSON types, and MongoMig warns about types PyMongo can't store. - Production-grade execution: distributed lock, idempotent batched operations with progress and ETA, retries, failure tracking, checksums, confirmation before destructive migrations, and restorable backups.
- See the impact first:
plan/--dry-runestimate documents touched and collection scans, and predict unique-index failures and validator rejections against real data. - Built for CI:
mongomig validate,--jsonoutput everywhere, documented exit codes.
Install
pip install mongomig # add [beanie] for Beanie support
Python 3.11+, MongoDB 6.0+ (tested on 6.0, 7.0, 8.0).
Quick start
mongomig init # mongomig.yaml + migrations/
export MONGODB_URI="mongodb://localhost:27017"
# register your models in migrations/env.py (see below), then:
mongomig revision --autogenerate -m "initial" # new project
mongomig baseline # ...or an existing database
mongomig upgrade
# app/models.py
from pydantic import BaseModel
from mongomig import collection, Index
@collection("users", indexes=[Index("email", unique=True)])
class User(BaseModel):
name: str
email: str
status: str = "active"
# migrations/env.py
from mongomig import MongoMetadata
import app.models # noqa: F401
target_metadata = MongoMetadata.default(storage="python") # or "json"; Beanie: register_beanie(...)
Everyday loop: edit models → mongomig diff → mongomig revision --autogenerate -m "..." →
review and commit → CI mongomig validate → deploy mongomig plan + mongomig upgrade.
Documentation
- Getting started
- Concepts: snapshots, storage profiles, classifications
- Writing migrations:
ctxandctx.opsreference - Autogenerate: what gets generated and how to review it
- Production guide: permissions, plan, locking, backups, recovery
- Coming from Alembic or hand-written scripts?
- CLI reference · Python API · Troubleshooting
Examples: FastAPI + Pydantic · FastAPI + Beanie
Status
The MVP is complete (config, revisions, upgrade/downgrade, schema inspection, diff, autogenerate, plan/dry-run, locking, batching, backups, CI checks). Planned next: drift detection (models vs live data), resumable checkpoints, transaction helpers, migration squashing.
Development
make install # uv venv + editable install with dev extras
make mongo-up # MongoDB 7 single-node replica set in Docker
make check # ruff + mypy --strict + pytest
Integration tests skip when MongoDB isn't running. To test another MongoDB version, run
MONGO_VERSION=8.0 make mongo-up.
Releasing
- Bump
src/mongomig/_version.pyand updateCHANGELOG.md, then merge tomain. - Create a GitHub Release with tag
v<version>and publish it. The release workflow checks the version, builds and smoke-tests the wheel, and publishes to PyPI via Trusted Publishing.
Contributing
Bug reports, ideas and pull requests are welcome. See CONTRIBUTING.md.
License
MIT
Release files for mongomig 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mongomig-0.1.1.tar.gz | 144.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mongomig-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 260.0 kB
Release files / mongomig-0.1.1.tar.gz
| Download URL | mongomig-0.1.1.tar.gz |
|---|---|
| Size | 144.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d1229bd6e82c87ef0485c262d1d4136a2b3ca6c31d390c7fbee1da98fda4adc7
|
|
BLAKE2b-256 checksum How to use checksums |
8f134cf201e9bec69cda6971547dafefbc6aa0bf1720f2f592d2a382289a95f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / mongomig-0.1.1-py3-none-any.whl
| Download URL | mongomig-0.1.1-py3-none-any.whl |
|---|---|
| Size | 115.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5b0f379a555b015e38b2567c871ccf6885018563a200b10d944e9a16dcb8bbf5
|
|
BLAKE2b-256 checksum How to use checksums |
9b2e92ee0e31a79e05d5e93129fb6de88c9bcf41943abeee910e3fa7ac3e778d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log