62 lines
1.7 KiB
Python
62 lines
1.7 KiB
Python
"""
|
|
Database connection management for Demo Session Service
|
|
"""
|
|
|
|
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
|
|
from sqlalchemy.pool import NullPool
|
|
import structlog
|
|
|
|
from .config import settings
|
|
|
|
logger = structlog.get_logger()
|
|
|
|
|
|
class DatabaseManager:
|
|
"""Database connection manager"""
|
|
|
|
def __init__(self, database_url: str = None):
|
|
self.database_url = database_url or settings.DATABASE_URL
|
|
self.engine = None
|
|
self.session_factory = None
|
|
|
|
def initialize(self):
|
|
"""Initialize database engine and session factory"""
|
|
self.engine = create_async_engine(
|
|
self.database_url,
|
|
echo=settings.DEBUG,
|
|
poolclass=NullPool,
|
|
pool_pre_ping=True
|
|
)
|
|
|
|
self.session_factory = async_sessionmaker(
|
|
self.engine,
|
|
class_=AsyncSession,
|
|
expire_on_commit=False,
|
|
autocommit=False,
|
|
autoflush=False
|
|
)
|
|
|
|
logger.info("Database manager initialized", database_url=self.database_url.split("@")[-1])
|
|
|
|
async def close(self):
|
|
"""Close database connections"""
|
|
if self.engine:
|
|
await self.engine.dispose()
|
|
logger.info("Database connections closed")
|
|
|
|
async def get_session(self) -> AsyncSession:
|
|
"""Get database session"""
|
|
if not self.session_factory:
|
|
self.initialize()
|
|
async with self.session_factory() as session:
|
|
yield session
|
|
|
|
|
|
db_manager = DatabaseManager()
|
|
|
|
|
|
async def get_db() -> AsyncSession:
|
|
"""Dependency for FastAPI"""
|
|
async for session in db_manager.get_session():
|
|
yield session
|