47 lines
1.0 KiB
Python
47 lines
1.0 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import AsyncGenerator
|
|
|
|
from sqlalchemy.ext.asyncio import (
|
|
AsyncSession,
|
|
async_sessionmaker,
|
|
create_async_engine,
|
|
)
|
|
|
|
from cpv3.infrastructure.settings import get_settings
|
|
|
|
|
|
_settings = get_settings()
|
|
_database_url = _settings.get_database_url()
|
|
|
|
_engine_kwargs: dict[str, bool | int] = {
|
|
"echo": _settings.debug,
|
|
"pool_pre_ping": True,
|
|
}
|
|
|
|
if not _database_url.startswith("sqlite"):
|
|
_engine_kwargs.update(
|
|
{
|
|
"pool_size": _settings.db_pool_size,
|
|
"max_overflow": _settings.db_max_overflow,
|
|
"pool_timeout": _settings.db_pool_timeout,
|
|
"pool_recycle": _settings.db_pool_recycle_seconds,
|
|
}
|
|
)
|
|
|
|
_engine = create_async_engine(
|
|
_database_url,
|
|
**_engine_kwargs,
|
|
)
|
|
|
|
SessionLocal = async_sessionmaker(
|
|
bind=_engine,
|
|
class_=AsyncSession,
|
|
expire_on_commit=False,
|
|
)
|
|
|
|
|
|
async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
|
async with SessionLocal() as session:
|
|
yield session
|