Spaces:
Sleeping
Sleeping
| """ | |
| Database Configuration | |
| Async SQLAlchemy engine with PostgreSQL support | |
| Unicode support for Marathi text | |
| """ | |
| from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker | |
| from sqlalchemy.orm import DeclarativeBase | |
| from sqlalchemy import MetaData | |
| from .config import settings | |
| # Naming convention for constraints | |
| convention = { | |
| "ix": "ix_%(column_0_label)s", | |
| "uq": "uq_%(table_name)s_%(column_0_name)s", | |
| "ck": "ck_%(table_name)s_%(constraint_name)s", | |
| "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", | |
| "pk": "pk_%(table_name)s" | |
| } | |
| metadata = MetaData(naming_convention=convention) | |
| class Base(DeclarativeBase): | |
| """Base class for all models""" | |
| metadata = metadata | |
| # Create async engine with PostgreSQL support | |
| engine = create_async_engine( | |
| settings.DATABASE_URL, | |
| echo=False, # Disable SQL logging | |
| pool_size=5, # Number of connections to keep in pool | |
| max_overflow=10, # Max additional connections beyond pool_size | |
| pool_pre_ping=True, # Verify connections before using | |
| pool_recycle=3600, # Recycle connections after 1 hour | |
| ) | |
| # Async session factory | |
| async_session = async_sessionmaker( | |
| engine, | |
| class_=AsyncSession, | |
| expire_on_commit=False | |
| ) | |
| async def get_db() -> AsyncSession: | |
| """Dependency to get database session""" | |
| async with async_session() as session: | |
| try: | |
| yield session | |
| await session.commit() | |
| except Exception: | |
| await session.rollback() | |
| raise | |
| finally: | |
| await session.close() | |
| async def init_db(): | |
| """Initialize database tables""" | |
| async with engine.begin() as conn: | |
| await conn.run_sync(Base.metadata.create_all) | |
| async def close_db(): | |
| """Close database connections""" | |
| await engine.dispose() | |