Skip to main content

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, $jsonSchema validators.
  • 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() vs jsonable_encoder stores 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-run estimate documents touched and collection scans, and predict unique-index failures and validator rejections against real data.
  • Built for CI: mongomig validate, --json output 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

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

  1. Bump src/mongomig/_version.py and update CHANGELOG.md, then merge to main.
  2. 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.

License

MIT

Release files for mongomig 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mongomig 0.1.0
File Size Uploaded
mongomig-0.1.0.tar.gz 140.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mongomig 0.1.0
File Interpreter ABI Platform
mongomig-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 255.4 kB

Release files / mongomig-0.1.0.tar.gz

Download URL mongomig-0.1.0.tar.gz
Size 140.3 kB
Tags Source
SHA-256 checksum
How to use checksums
39bd594aebdd74296da04c06894863f79d5b2f472f90ce7d1ff8919d254660bd
BLAKE2b-256 checksum
How to use checksums
a3c898ab76895969323064e751511938bcf6401faf37f975a80ca4b01e24e75f
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

Release files / mongomig-0.1.0-py3-none-any.whl

Download URL mongomig-0.1.0-py3-none-any.whl
Size 115.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
88a788d7f6fdb46fbce3e405785bf357a94891851646e6810850964da376283c
BLAKE2b-256 checksum
How to use checksums
a878acfce91bbad8659bd85357bde187f39034361415c36915a1662e5bb93bd0
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
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page