From 75d0d096df82137b74e3f35f52aec29b3d69667d Mon Sep 17 00:00:00 2001 From: Kai Chappell Date: Tue, 15 Apr 2025 21:54:14 +0100 Subject: [PATCH] feat(backend): db session config --- backend/src/db/__init__.py | 0 backend/src/db/database.py | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 backend/src/db/__init__.py create mode 100644 backend/src/db/database.py diff --git a/backend/src/db/__init__.py b/backend/src/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/src/db/database.py b/backend/src/db/database.py new file mode 100644 index 0000000..12a28fb --- /dev/null +++ b/backend/src/db/database.py @@ -0,0 +1,40 @@ +from collections.abc import AsyncGenerator +from typing import Any + +from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine + +from src.config import get_settings + +settings = get_settings() + +# Build engine kwargs conditionally (SQLite doesn't support pool settings) +engine_kwargs: dict[str, Any] = { + "echo": settings.debug, +} + +if settings.database_url.startswith("postgresql"): + engine_kwargs.update( + pool_pre_ping=True, + pool_size=5, + max_overflow=10, + pool_recycle=3600, + ) + +engine = create_async_engine(settings.database_url, **engine_kwargs) + +async_session_factory = async_sessionmaker( + engine, + class_=AsyncSession, + expire_on_commit=False, +) + + +async def get_db() -> AsyncGenerator[AsyncSession, None]: + """Dependency that provides a database session.""" + async with async_session_factory() as session: + try: + yield session + await session.commit() + except Exception: + await session.rollback() + raise