session.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from collections.abc import AsyncGenerator
  2. from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
  3. from sqlmodel import SQLModel
  4. from sqlmodel.ext.asyncio.session import AsyncSession
  5. from app.core.config import get_settings
  6. # Import all models to ensure they are registered with SQLModel.metadata
  7. from app.models import ( # noqa: F401
  8. Cargo,
  9. Company,
  10. Inventory,
  11. Plan,
  12. User,
  13. Vehicle,
  14. Weighing,
  15. )
  16. settings = get_settings()
  17. # 配置连接池参数
  18. # SQLAlchemy 内置连接池,无需额外插件
  19. engine = create_async_engine(
  20. settings.database_url,
  21. echo=settings.env == "dev",
  22. # 连接池配置(从环境变量读取)
  23. pool_size=settings.db_pool_size,
  24. max_overflow=settings.db_max_overflow,
  25. pool_timeout=settings.db_pool_timeout,
  26. pool_recycle=settings.db_pool_recycle,
  27. pool_pre_ping=settings.db_pool_pre_ping,
  28. )
  29. AsyncSessionLocal = async_sessionmaker(
  30. bind=engine, class_=AsyncSession, expire_on_commit=False, autoflush=False
  31. )
  32. async def get_async_session() -> AsyncGenerator[AsyncSession, None]:
  33. async with AsyncSessionLocal() as session:
  34. yield session
  35. async def init_models() -> None:
  36. async with engine.begin() as conn:
  37. await conn.run_sync(SQLModel.metadata.create_all)