from collections.abc import Iterator from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.orm import Session, sessionmaker from app.config import get_settings _settings = get_settings() # prepare_threshold=None: psycopg domyslnie przygotowuje zapytanie po 5 wykonaniach na # polaczeniu, a Postgres po kolejnych 5 potrafi przejsc na plan ogolny, niezalezny od # parametrow. Dla list tagu to katastrofa: plan dobry dla malego tagu na duzym ("pov") # trwal 44 s zamiast 0,46 s (pomiar 2026-09-23), wiec lista ladowala sie raz szybko, raz # minute, zaleznie od tego, ktore polaczenie z puli trafilo. Planowanie od nowa to kilka ms. engine = create_engine( _settings.database_url, pool_pre_ping=True, future=True, connect_args={"prepare_threshold": None}, ) SessionLocal = sessionmaker(bind=engine, autoflush=False, expire_on_commit=False, future=True) @contextmanager def session_scope() -> Iterator[Session]: session = SessionLocal() try: yield session session.commit() except Exception: session.rollback() raise finally: session.close() def get_session() -> Iterator[Session]: with session_scope() as session: yield session