from collections.abc import AsyncGenerator from typing import Any from sqlalchemy.dialects.postgresql import insert as postgresql_insert from sqlalchemy.dialects.sqlite import insert as sqlite_insert from sqlalchemy.ext.asyncio import ( AsyncSession, async_sessionmaker, create_async_engine, ) from sqlalchemy.orm import DeclarativeBase from app.config import settings engine = create_async_engine( settings.database_url, pool_size=settings.db_pool_size, pool_timeout=settings.db_pool_timeout, pool_pre_ping=True, echo=False, ) async_session_factory = async_sessionmaker( engine, class_=AsyncSession, expire_on_commit=False, ) class Base(DeclarativeBase): pass def insert_for_session(session: AsyncSession, table: Any) -> Any: """Build a dialect-native INSERT that supports conflict handling.""" if session.get_bind().dialect.name == "postgresql": return postgresql_insert(table) return sqlite_insert(table) async def get_session() -> AsyncGenerator[AsyncSession, None]: async with async_session_factory() as session: yield session