shutdown fixes

This commit is contained in:
John Lancaster
2026-08-01 09:36:34 -05:00
parent d0a3ca0289
commit d75083a666
3 changed files with 28 additions and 10 deletions
-1
View File
@@ -74,7 +74,6 @@ class Settings(BaseSettings):
# --- persistence ---
database: DatabaseSettings = Field(default_factory=SqliteSettings)
database_url: str = "sqlite:///./transcription.db"
bootstrap_schema_on_startup: bool = False
sqlite_check_same_thread: bool = False
+24 -8
View File
@@ -8,6 +8,7 @@ from sqlalchemy.ext.asyncio import AsyncSessionTransaction
from sqlalchemy.ext.asyncio import async_sessionmaker
from sqlmodel.ext.asyncio.session import AsyncSession
from ..config import Settings
from ..config import get_settings
from .engine import dispose_engine
from .engine import get_database_url
@@ -25,8 +26,13 @@ def get_session_factory(database_url: str) -> SessionFactory:
)
def resolve_session_factory(database_url: str | None = None) -> SessionFactory:
return get_session_factory(database_url or get_database_url(get_settings()))
def resolve_session_factory(
database_url: str | None = None,
*,
settings: Settings | None = None,
) -> SessionFactory:
active_settings = settings or get_settings()
return get_session_factory(database_url or get_database_url(active_settings))
type SessionFactoryDep = Annotated[SessionFactory, Depends(resolve_session_factory)]
@@ -40,15 +46,20 @@ async def dispose_session_factory(database_url: str) -> None:
@asynccontextmanager
async def session_scope(
*,
settings: Settings | None = None,
database_url: str | None = None,
session_factory: SessionFactory | None = None,
session: AsyncSession | None = None,
) -> AsyncGenerator[AsyncSession]:
if session is not None:
yield session
return
session_factory = resolve_session_factory(database_url)
async with session_factory() as owned_session:
active_session_factory = session_factory or resolve_session_factory(
database_url,
settings=settings,
)
async with active_session_factory() as owned_session:
yield owned_session
@@ -58,9 +69,11 @@ type SessionScopeDep = Annotated[AsyncSession, Depends(session_scope)]
@asynccontextmanager
async def transaction_scope(
*,
settings: Settings | None = None,
database_url: str | None = None,
session: AsyncSessionTransaction | None = None,
) -> AsyncGenerator[AsyncSessionTransaction]:
session_factory: SessionFactory | None = None,
session: AsyncSession | AsyncSessionTransaction | None = None,
) -> AsyncGenerator[AsyncSession | AsyncSessionTransaction]:
match session:
case AsyncSession() as async_session:
if not async_session.in_transaction():
@@ -71,8 +84,11 @@ async def transaction_scope(
yield async_transaction
return
session_factory = resolve_session_factory(database_url)
async with session_factory().begin() as owned_session:
active_session_factory = session_factory or resolve_session_factory(
database_url,
settings=settings,
)
async with active_session_factory.begin() as owned_session:
yield owned_session
+4 -1
View File
@@ -31,7 +31,10 @@ class ServiceBase(ABC):
@asynccontextmanager
async def _session_scope(self, session: AsyncSession | None = None):
"""Provide a transactional scope around a series of operations."""
async with session_scope(session=session) as active_session:
async with session_scope(
session_factory=self.session_factory,
session=session,
) as active_session:
yield active_session
async def _finalize(