from collections.abc import AsyncGenerator from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine from sqlmodel import SQLModel from sqlmodel.ext.asyncio.session import AsyncSession from app.core.config import settings from app.core.logging import get_logger from app.models import ( # noqa: F401 plan, playlist, playlist_sound, sound, sound_played, stream, user, user_oauth, ) engine: AsyncEngine = create_async_engine( settings.DATABASE_URL, echo=settings.DATABASE_ECHO, ) async def get_db() -> AsyncGenerator[AsyncSession, None]: logger = get_logger(__name__) async with AsyncSession(engine) as session: try: yield session except Exception as e: logger.exception("Database session error: %s", e) await session.rollback() raise finally: await session.close() async def init_db() -> None: logger = get_logger(__name__) try: logger.info("Initializing database tables") async with engine.begin() as conn: await conn.run_sync(SQLModel.metadata.create_all) logger.info("Database tables created successfully") except Exception as e: logger.exception("Failed to initialize database: %s", e) raise