__init__.py
1 from contextlib import asynccontextmanager 2 from functools import wraps 3 from typing import Any, AsyncIterator, Awaitable, Callable, TypeVar 4 5 from .database import Base, delete, exists, filter_by, get_database, select 6 7 8 T = TypeVar("T") 9 10 11 @asynccontextmanager 12 async def db_context() -> AsyncIterator[None]: 13 """Async context manager for database sessions.""" 14 15 db.create_session() 16 try: 17 yield 18 finally: 19 await db.commit() 20 await db.close() 21 22 23 def db_wrapper(f: Callable[..., Awaitable[T]]) -> Callable[..., Awaitable[T]]: 24 """Decorator which wraps an async function in a database context.""" 25 26 @wraps(f) 27 async def inner(*args: Any, **kwargs: Any) -> T: 28 async with db_context(): 29 return await f(*args, **kwargs) 30 31 return inner 32 33 34 # global database connection object 35 db = get_database() 36 37 38 __all__ = ["db_context", "db_wrapper", "select", "filter_by", "exists", "delete", "db", "Base"]