"""Declarative base for all ORM models. Naming convention is set explicitly so Alembic generates stable, reviewable constraint names across migrations and Postgres versions. """ from __future__ import annotations from sqlalchemy import MetaData from sqlalchemy.orm import DeclarativeBase # https://alembic.sqlalchemy.org/en/latest/naming.html#integration-of-naming-conventions-into-operations-autogenerate NAMING_CONVENTION = { "ix": "ix_%(table_name)s_%(column_0_N_name)s", "uq": "uq_%(table_name)s_%(column_0_N_name)s", "ck": "ck_%(table_name)s_%(constraint_name)s", "fk": "fk_%(table_name)s_%(column_0_N_name)s_%(referred_table_name)s", "pk": "pk_%(table_name)s", } class Base(DeclarativeBase): metadata = MetaData(naming_convention=NAMING_CONVENTION)