# backend/db/session.py from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import NullPool from sqlalchemy.orm import Session from dotenv import load_dotenv import os # Load environment variables load_dotenv() # Read .env settings USER = os.getenv("user") PASSWORD = os.getenv("password") HOST = os.getenv("host") PORT = os.getenv("port") DBNAME = os.getenv("dbname") # Supabase Transaction Pooler (IPv4-safe) URI DATABASE_URL = f"postgresql+psycopg2://{USER}:{PASSWORD}@{HOST}:{PORT}/{DBNAME}?sslmode=require" # SQLAlchemy engine with NullPool for Supabase engine = create_engine(DATABASE_URL, poolclass=NullPool) # Session factory (used for queries) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # Base class for ORM models Base = declarative_base() # ─────────────────────────────── # FastAPI helper (NEW, non-breaking) # ─────────────────────────────── def get_db() -> Session: """ Yield a DB session for FastAPI dependencies. Closes the session automatically after the request. """ db = SessionLocal() try: yield db finally: db.close()