From 035b22fd1ee5a725ac02fe9c0304f0afa962951d Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 3 Sep 2026 23:06:44 +0200 Subject: [PATCH] =?UTF-8?q?Migration-Bugfix:=20DDL=20statementweise=20stat?= =?UTF-8?q?t=20als=20Multi-Statement-Block=20ausf=C3=BChren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit asyncpg (SQLAlchemy async) lässt keine Mehrfach-Statements in einem prepared statement zu - "cannot insert multiple commands into a prepared statement". Aufgetreten beim ersten echten alembic upgrade head auf dem Zielserver. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01L85hmKbvX7Cqkq47KnQhFt --- DEVLOG.md | 12 ++++++++++++ backend/alembic/versions/0001_initial_schema.py | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 27cf664..7d1145a 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1107,3 +1107,15 @@ Keine Commits in dieser Session. - backend/tests/test_roles.py | 28 +++++++ --- +## 2026-09-03 22:55 – 23:04 (9m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- b5c46cf Installer-Bugfix: sudo-Abhängigkeit entfernt, SQL-Ausführung über stdin statt su-Argument +- 446e4f9 Deployment-Setup (PostgreSQL+nginx-Installer) + Sprint-0-Fixes aus Subagenten-Reviews + +### Geänderte Dateien +- deploy/install_server.sh | 21 +++++++++++++++------ + +--- diff --git a/backend/alembic/versions/0001_initial_schema.py b/backend/alembic/versions/0001_initial_schema.py index b4b65ec..4ac89bb 100644 --- a/backend/alembic/versions/0001_initial_schema.py +++ b/backend/alembic/versions/0001_initial_schema.py @@ -283,9 +283,21 @@ DROP TYPE IF EXISTS materialtyp; """ +def _execute_statements(sql: str) -> None: + # asyncpg lässt keine Mehrfach-Statements in einem prepared statement zu + # (Fund beim ersten realen `alembic upgrade head` gegen asyncpg) – jedes + # ";"-getrennte Statement einzeln ausführen. Kein Statement in diesem + # Schema enthält ein Semikolon innerhalb eines String-/Kommentarwerts, + # daher ist ein simpler Split sicher. + for statement in sql.split(";"): + statement = statement.strip() + if statement: + op.execute(statement) + + def upgrade() -> None: - op.execute(UPGRADE_SQL) + _execute_statements(UPGRADE_SQL) def downgrade() -> None: - op.execute(DOWNGRADE_SQL) + _execute_statements(DOWNGRADE_SQL)