from typing import AsyncGenerator from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlmodel import SQLModel, create_engine from playlist_sync.config import settings # For synchronous operations (e.g., simple migrations or scripts) sync_engine = create_engine( settings.DATABASE_URL.replace("mysql+aiomysql://", "mysql+pymysql://"), echo=False ) # For asynchronous operations (FastAPI/Worker) async_engine = create_async_engine(settings.DATABASE_URL, echo=False) AsyncSessionLocal = async_sessionmaker( async_engine, class_=AsyncSession, expire_on_commit=False ) async def get_session() -> AsyncGenerator[AsyncSession, None]: async with AsyncSessionLocal() as session: yield session async def init_db() -> None: async with async_engine.begin() as conn: # In a real migration, we wouldn't drop tables, # but for dev/testing setup this is useful. await conn.run_sync(SQLModel.metadata.create_all)