from sqlalchemy import Boolean, Column, DateTime, Integer from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import declarative_base, sessionmaker from sqlalchemy.sql import func from shared.config import settings # Database setup engine = create_async_engine( settings.DATABASE_URL, echo=settings.DEBUG, future=True, pool_size=20, max_overflow=30, pool_pre_ping=True, ) AsyncSessionLocal = sessionmaker( engine, class_=AsyncSession, expire_on_commit=False, ) Base = declarative_base() class BaseModel(Base): """Base model with common fields""" __abstract__ = True id = Column(Integer, primary_key=True, index=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) is_active = Column(Boolean, default=True) async def get_db() -> AsyncSession: """Database session dependency""" async with AsyncSessionLocal() as session: try: yield session except Exception: await session.rollback() raise finally: await session.close() async def init_db(): """Initialize database""" async with engine.begin() as conn: # Import all models here to ensure they are registered from services.calendar_service.models import CalendarEntry from services.emergency_service.models import EmergencyAlert from services.location_service.models import UserLocation from services.user_service.models import User await conn.run_sync(Base.metadata.create_all)