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.