from collections.abc import Generator from pathlib import Path from sqlalchemy import create_engine from sqlalchemy.orm import Session, sessionmaker from app.core.config import settings if settings.is_production and settings.database_url.startswith("sqlite"): raise RuntimeError("Production deployment requires DATABASE_URL configured for MySQL") def _engine_kwargs() -> dict: """数据库连接:根据数据库类型设置 SQLAlchemy engine 参数。""" if settings.database_url.startswith("sqlite"): Path("storage").mkdir(exist_ok=True) return {"connect_args": {"check_same_thread": False}} return {"pool_pre_ping": True, "pool_recycle": 3600, "connect_args": {"connect_timeout": 5}} engine = create_engine(settings.database_url, **_engine_kwargs()) SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, expire_on_commit=False) def get_db() -> Generator[Session, None, None]: """请求依赖:为每个请求创建数据库会话并在结束后关闭。""" db = SessionLocal() try: yield db finally: db.close()