import os from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, declarative_base from sqlalchemy.exc import OperationalError # ========================================================== # DATABASE URL # ========================================================== DATABASE_URL = os.getenv("DATABASE_URL") if not DATABASE_URL: raise RuntimeError( "DATABASE_URL environment variable is not set" ) # ========================================================== # SUPABASE ENTERPRISE ENGINE CONFIG # ========================================================== # Optimized for: # - Supabase Pooler # - FastAPI async workload # - Background workers # - Long-running autonomous services engine = create_engine( DATABASE_URL, # --- Pool Stability --- pool_pre_ping=True, # validates dead connections pool_recycle=300, # refresh connections pool_size=5, # safe baseline max_overflow=10, # burst capacity # --- Reliability --- echo=False, future=True, # --- Supabase Requirement --- connect_args={ "sslmode": "require", "connect_timeout": 10, }, ) # ========================================================== # SESSION FACTORY # ========================================================== SessionLocal = sessionmaker( autocommit=False, autoflush=False, bind=engine, ) # ========================================================== # BASE MODEL # ========================================================== Base = declarative_base() # ========================================================== # DEPENDENCY (FASTAPI) # ========================================================== def get_db(): """ FastAPI dependency injection session. Ensures connection cleanup even on crash. """ db = SessionLocal() try: yield db finally: db.close() # ========================================================== # CONNECTION TEST (STARTUP SAFE) # ========================================================== def verify_database_connection(): """ Validates database connectivity during startup. Prevents silent runtime failures. """ try: with engine.connect() as conn: conn.execute("SELECT 1") except OperationalError as e: raise RuntimeError( f"Database connection failed: {str(e)}" )