diff --git a/CHANGELOG.md b/CHANGELOG.md index ffecf65..d0cf37e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,9 @@ die Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/). - Vollständiges Datenmodell als SQLAlchemy-2.0-Modelle: Konten, Kategorien, Firmen, Logo-Assets, Recurrences, Preishistorie, Occurrences, Buchungen, Budgets samt Vorlagen, Sparziele, Rücklagen, Benachrichtigungsregeln und -protokoll, Benutzer. -- Alembic-Setup gegen die Async-Engine samt Erstmigration des kompletten Schemas. +- Alembic-Setup gegen die Async-Engine samt Erstmigration des kompletten Schemas; + der Downgrade entfernt auch die nativen Enum-Typen, sodass Auf- und Abwärtsmigration + beliebig oft wiederholbar sind. - Idempotenter Seed für den deutschen Standard-Kategoriebaum (35 Kategorien) und die Standard-Benachrichtigungsregeln. - Endpunkte `GET /api/health` und `GET /api/version`. diff --git a/backend/alembic/versions/20260909_1307_initial_schema.py b/backend/alembic/versions/20260909_1307_initial_schema.py index d0604ed..e4df263 100644 --- a/backend/alembic/versions/20260909_1307_initial_schema.py +++ b/backend/alembic/versions/20260909_1307_initial_schema.py @@ -16,6 +16,20 @@ branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None +# Alle nativen PostgreSQL-Enum-Typen dieses Schemas. +ENUM_TYPES = ( + "account_type", + "business_day_shift", + "entry_kind", + "logo_source", + "logo_status", + "notification_channel", + "notification_status", + "notification_type", + "occurrence_status", +) + + def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table('account', @@ -288,3 +302,8 @@ def downgrade() -> None: op.drop_index('ix_account_is_active', table_name='account') op.drop_table('account') # ### end Alembic commands ### + + # Alembic entfernt die nativen Enum-Typen nicht automatisch – ohne diesen Schritt + # scheitert ein erneutes `upgrade head` an bereits vorhandenen Typen. + for enum_name in ENUM_TYPES: + sa.Enum(name=enum_name).drop(op.get_bind(), checkfirst=True)