agilentics / boiler
Generic single-database configuration.

The URL is not in alembic.ini - alembic/env.py builds it from settings.Config
through utils.db_wrapper, so there is one definition of how a connection string
is made instead of two that can drift.

    alembic revision --autogenerate -m "add widgets"
    alembic upgrade head
    alembic check          # does the schema match the models?

`alembic check` runs in CI after the migration and before the deploy. It is the
only thing that compares models to schema: the tests need no database, and
`upgrade head` only applies what exists - so without it a model with a column
nobody wrote a migration for reaches production and fails at runtime.