From 236f415efe8655d2e1b8c86f7dd5a66394992bfd Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Tue, 4 Aug 2026 23:03:32 +0200 Subject: [PATCH] create schema if not existing --- Dockerfile | 1 + src/db.py | 21 +++++++++++++++++++++ src/scheduler.py | 8 ++++++++ 3 files changed, 30 insertions(+) diff --git a/Dockerfile b/Dockerfile index 1ed67e4..b2d930d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ COPY requirements.txt /app/requirements.txt RUN pip install --no-cache-dir -r /app/requirements.txt COPY src/ /app/ +COPY sql/ /app/sql/ COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh diff --git a/src/db.py b/src/db.py index f0b4820..4f5e0d5 100644 --- a/src/db.py +++ b/src/db.py @@ -1,5 +1,6 @@ """MariaDB-Anbindung: Delta-Sync-Strategie (Upsert für Änderungen, gezieltes Löschen für Removals).""" import logging +import os import uuid from contextlib import contextmanager @@ -10,6 +11,8 @@ from config import Config logger = logging.getLogger(__name__) +SCHEMA_PATH = os.path.join(os.path.dirname(__file__), "..", "sql", "schema.sql") + @contextmanager def get_connection(): @@ -24,6 +27,24 @@ def get_connection(): conn.close() +def ensure_schema(): + """Legt alle Tabellen an, falls sie noch nicht existieren (idempotent).""" + schema_file = os.path.normpath(SCHEMA_PATH) + if not os.path.exists(schema_file): + logger.warning("Schema-Datei nicht gefunden: %s — überspringe Init", schema_file) + return + with open(schema_file, "r", encoding="utf-8") as f: + sql = f.read() + with get_connection() as conn: + with conn.cursor() as cur: + for statement in sql.split(";"): + statement = statement.strip() + if statement: + cur.execute(statement) + conn.commit() + logger.info("Datenbank-Schema geprüft/initialisiert") + + def get_sync_token(conn, account: str) -> str | None: with conn.cursor() as cur: cur.execute("SELECT sync_token FROM sync_state WHERE account = %s", (account,)) diff --git a/src/scheduler.py b/src/scheduler.py index 7c9b4cd..a1653b2 100644 --- a/src/scheduler.py +++ b/src/scheduler.py @@ -16,6 +16,8 @@ import sys import time from datetime import datetime, timedelta +import db + logging.basicConfig( level=os.environ.get("LOG_LEVEL", "INFO"), format="%(asctime)s [%(levelname)s] %(message)s", @@ -90,6 +92,12 @@ def main(): else: logger.info("Mailer: deaktiviert (MAILER_ENABLED=false)") + logger.info("Pruefe/initialisiere Datenbank-Schema...") + try: + db.ensure_schema() + except Exception: + logger.exception("Schema-Init fehlgeschlagen — Sync wird trotzdem gestartet") + logger.info("Fuehre initialen Sync aus...") run_sync()