forked from cartsnitch/cartsnitch
Merge commit '4cf6f91e954b770198578bcb8db5d98ac964bfed' as 'common'
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
"""Database engine and session factories for sync and async usage."""
|
||||
|
||||
from collections.abc import AsyncGenerator, Generator
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
|
||||
from sqlalchemy.orm import Session, sessionmaker
|
||||
|
||||
from cartsnitch_common.config import settings
|
||||
|
||||
|
||||
def get_async_engine(url: str | None = None):
|
||||
"""Create an async SQLAlchemy engine."""
|
||||
return create_async_engine(url or settings.database_url, echo=settings.debug)
|
||||
|
||||
|
||||
def get_sync_engine(url: str | None = None):
|
||||
"""Create a sync SQLAlchemy engine."""
|
||||
return create_engine(url or settings.database_url_sync, echo=settings.debug)
|
||||
|
||||
|
||||
def get_async_session_factory(url: str | None = None) -> async_sessionmaker[AsyncSession]:
|
||||
"""Create an async session factory."""
|
||||
engine = get_async_engine(url)
|
||||
return async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
||||
|
||||
|
||||
def get_sync_session_factory(url: str | None = None) -> sessionmaker[Session]:
|
||||
"""Create a sync session factory."""
|
||||
engine = get_sync_engine(url)
|
||||
return sessionmaker(engine, expire_on_commit=False)
|
||||
|
||||
|
||||
async def get_async_session(url: str | None = None) -> AsyncGenerator[AsyncSession, None]:
|
||||
"""Dependency for async session injection."""
|
||||
factory = get_async_session_factory(url)
|
||||
async with factory() as session:
|
||||
yield session
|
||||
|
||||
|
||||
def get_sync_session(url: str | None = None) -> Generator[Session, None, None]:
|
||||
"""Dependency for sync session injection."""
|
||||
factory = get_sync_session_factory(url)
|
||||
with factory() as session:
|
||||
yield session
|
||||
Reference in New Issue
Block a user