from sqlalchemy import create_engine from sqlalchemy.orm import DeclarativeBase, sessionmaker from sqlalchemy.pool import StaticPool from config import settings class Base(DeclarativeBase): pass _connect_args = {} _pool_class = None if settings.database_url.startswith("sqlite"): _connect_args = {"check_same_thread": False} _pool_class = StaticPool engine = create_engine( settings.database_url, connect_args=_connect_args, **({"poolclass": _pool_class} if _pool_class else {}), echo=settings.debug, ) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close() def init_db() -> None: from db import models # noqa: F401 – Modelle müssen importiert sein Base.metadata.create_all(bind=engine) _create_default_admin() def _create_default_admin() -> None: """Legt beim ersten Start einen Admin-Benutzer an, falls keine User existieren.""" import bcrypt from db.models import User db = SessionLocal() try: if not db.query(User).first(): pw_hash = bcrypt.hashpw( settings.default_admin_password.encode(), bcrypt.gensalt() ).decode() admin = User( username=settings.default_admin_user, password_hash=pw_hash, role="admin", is_active=True, ) db.add(admin) db.commit() finally: db.close()