""" Database Configuration and Session Management 支持 SQLite 和 PostgreSQL """ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from sqlalchemy.orm import DeclarativeBase from sqlalchemy import create_engine from app.core.config import get_settings settings = get_settings() def get_engine_config(): """根据数据库类型返回引擎配置""" if settings.DATABASE_URL.startswith("sqlite"): return {"echo": settings.DEBUG} else: return { "echo": settings.DEBUG, "pool_pre_ping": True, "pool_size": 10, "max_overflow": 20, } # Async engine for FastAPI async_engine = create_async_engine( settings.DATABASE_URL, **get_engine_config() ) # Sync engine for migrations sync_engine = create_engine( settings.DATABASE_URL_SYNC, echo=settings.DEBUG, pool_pre_ping=True, ) # Async session factory AsyncSessionLocal = async_sessionmaker( async_engine, class_=AsyncSession, expire_on_commit=False, autocommit=False, autoflush=False, ) class Base(DeclarativeBase): """Base class for all models""" pass async def init_db(): """Initialize database tables""" async with async_engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) async def get_db() -> AsyncSession: """Dependency for getting database session""" async with AsyncSessionLocal() as session: try: yield session finally: await session.close()