Spaces:
Sleeping
Sleeping
File size: 2,521 Bytes
2a1425b 4b4f221 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | import os
from contextlib import contextmanager
from sqlalchemy.orm import Session, sessionmaker
from typing import Generator
from .connection import engine
from ..utils.logging_config import get_logger
# Configure logging
logger = get_logger(__name__)
# Create a session factory bound to the engine
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
logger.debug("Database session factory created")
def get_session() -> Generator[Session, None, None]:
"""
Dependency to get database session for FastAPI endpoints.
Yields:
Session: SQLAlchemy database session
"""
logger.debug("Creating new database session for FastAPI endpoint")
db = SessionLocal()
try:
yield db
finally:
logger.debug("Closing database session for FastAPI endpoint")
db.close()
@contextmanager
def get_db_session():
"""
Context manager to get database session for use outside of FastAPI endpoints.
Yields:
Session: SQLAlchemy database session
"""
logger.debug("Creating new database session via context manager")
db = SessionLocal()
try:
yield db
finally:
logger.debug("Closing database session via context manager")
db.close()
def get_session_sync() -> Session:
"""
Synchronous function to get database session.
Returns:
Session: SQLAlchemy database session (remember to close it manually)
"""
logger.debug("Creating synchronous database session")
return SessionLocal()
def close_session(db: Session):
"""
Close the database session.
Args:
db (Session): SQLAlchemy database session to close
"""
logger.debug("Manually closing database session")
db.close()
# Convenience function to run database operations with automatic session management
def run_db_operation(operation_func, *args, **kwargs):
"""
Run a database operation with automatic session management.
Args:
operation_func: Function to run with database session
*args: Arguments to pass to the operation function
**kwargs: Keyword arguments to pass to the operation function
Returns:
Result of the operation function
"""
logger.debug(f"Running database operation: {operation_func.__name__}")
with get_db_session() as db:
kwargs['db'] = db
result = operation_func(*args, **kwargs)
logger.debug(f"Database operation completed: {operation_func.__name__}")
return result |