Spaces:
Runtime error
Runtime error
| """ | |
| Database configuration and session management. | |
| Provides SQLAlchemy engine with connection pooling and session dependency for FastAPI. | |
| """ | |
| from typing import Generator | |
| from sqlalchemy import create_engine, text | |
| from sqlalchemy.exc import SQLAlchemyError | |
| from sqlmodel import Session, SQLModel | |
| from src.core.config import settings | |
| # Create SQLAlchemy engine with connection pooling | |
| engine = create_engine( | |
| str(settings.database_url), | |
| pool_size=10, # Number of connections to maintain | |
| max_overflow=20, # Additional connections when pool is full | |
| pool_recycle=3600, # Recycle connections after 1 hour | |
| pool_pre_ping=True, # Verify connections before using | |
| echo=settings.is_development, # Log SQL in development | |
| ) | |
| def init_db() -> None: | |
| """ | |
| Initialize database by creating all tables. | |
| This should only be used for development/testing. | |
| In production, use Alembic migrations instead. | |
| """ | |
| SQLModel.metadata.create_all(engine) | |
| def get_session() -> Generator[Session, None, None]: | |
| """ | |
| FastAPI dependency for database session. | |
| Yields a database session and ensures it's closed after use. | |
| Automatically handles rollback on errors. | |
| Yields: | |
| Session: SQLAlchemy session | |
| Example: | |
| @app.get("/users") | |
| def get_users(db: Session = Depends(get_session)): | |
| return db.exec(select(User)).all() | |
| """ | |
| session = Session(engine) | |
| try: | |
| yield session | |
| session.commit() | |
| except SQLAlchemyError: | |
| session.rollback() | |
| raise | |
| finally: | |
| session.close() | |
| class DatabaseManager: | |
| """ | |
| Database manager for advanced operations. | |
| Provides methods for health checks, connection testing, | |
| and administrative tasks. | |
| """ | |
| def check_connection() -> bool: | |
| """ | |
| Check if database connection is alive. | |
| Returns: | |
| bool: True if connection is successful, False otherwise | |
| """ | |
| try: | |
| with engine.connect() as conn: | |
| conn.execute(text("SELECT 1")) | |
| return True | |
| except Exception as e: | |
| print(f"Database connection error: {e}") | |
| return False | |
| def get_pool_status() -> dict: | |
| """ | |
| Get connection pool status. | |
| Returns: | |
| dict: Pool statistics including size, checked out, and overflow | |
| """ | |
| pool = engine.pool | |
| return { | |
| 'pool_size': pool.size(), | |
| 'checked_out': pool.checkedout(), | |
| 'overflow': pool.overflow(), | |
| 'max_overflow': engine.pool.max_overflow, | |
| } | |
| # Export for use in other modules | |
| __all__ = ['engine', 'get_session', 'init_db', 'DatabaseManager'] | |