Skip to content

Migrations And Reflection

This guide shows how to compare registered model metadata with live database metadata.

What The Example Covers

  • db.migrations.snapshot();
  • db.migrations.live_snapshot();
  • diff generation;
  • dry-run SQL;
  • basic inspector calls.
"""Migration and reflection example."""

import asyncio
from uuid import uuid4

from pydantic import BaseModel

from ormdantic import Ormdantic
from ormdantic.migrations import MigrationOperation, MigrationPlan

db = Ormdantic("sqlite:///examples_migrations_reflection.sqlite3")


@db.table(pk="id")
class Flavor(BaseModel):
    id: str
    name: str


async def main() -> None:
    await db.init()

    inspector = db.inspect()
    print(await inspector.table_names())
    print(await inspector.columns("flavor"))

    revision = f"example-{uuid4()}"
    await db.migrations.apply(
        revision,
        MigrationPlan(
            [MigrationOperation("CREATE TABLE IF NOT EXISTS extra (id TEXT)")]
        ),
    )
    assert revision in await db.migrations.applied_revisions()


if __name__ == "__main__":
    asyncio.run(main())

Run it locally:

python examples/migrations_reflection.py

Review Workflow

For application migrations, generate a migration artifact, review the SQL, run it in staging, and only then apply it in production. Ormdantic records applied revisions in the migration history table.