__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"]