Coverage for src / idx_api / database.py: 73%
22 statements
« prev ^ index » next coverage.py v7.13.1, created at 2025-12-28 11:09 -0700
« prev ^ index » next coverage.py v7.13.1, created at 2025-12-28 11:09 -0700
1"""Database connection and session management for PostgreSQL with pgvector."""
3from collections.abc import Generator
4from contextlib import contextmanager
6from sqlalchemy import create_engine, event, text
7from sqlalchemy.orm import Session, sessionmaker
9from idx_api.config import settings
11# Create PostgreSQL engine with connection pooling
12engine = create_engine(
13 settings.database_url,
14 echo=settings.environment == "dev",
15 pool_size=10,
16 max_overflow=20,
17 pool_pre_ping=True, # Verify connections before use
18)
21@event.listens_for(engine, "connect")
22def enable_pgvector(dbapi_connection, connection_record):
23 """Enable pgvector extension on first connection."""
24 with dbapi_connection.cursor() as cursor:
25 cursor.execute("CREATE EXTENSION IF NOT EXISTS vector")
28SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
31def get_db() -> Generator[Session, None, None]:
32 """Dependency for FastAPI routes."""
33 db = SessionLocal()
34 try:
35 yield db
36 finally:
37 db.close()
40@contextmanager
41def get_db_session() -> Generator[Session, None, None]:
42 """Context manager for non-FastAPI usage."""
43 db = SessionLocal()
44 try:
45 yield db
46 finally:
47 db.close()