from __future__ import annotations from sqlalchemy import create_engine, event from sqlalchemy.engine import Engine from app.core.config import settings def _create_read_only_engine(connection_url: str) -> Engine: engine = create_engine( connection_url, pool_pre_ping=True, pool_recycle=3600, future=True ) @event.listens_for(engine, "connect") def _on_connect(dbapi_connection, _connection_record) -> None: cursor = dbapi_connection.cursor() try: cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED;") finally: cursor.close() return engine def create_warehouse_engines() -> dict[str, Engine]: return { "wwi": _create_read_only_engine(settings.wwi_connection_url), "aw": _create_read_only_engine(settings.aw_connection_url), } def dispose_engines(engines: dict[str, Engine]) -> None: for engine in engines.values(): engine.dispose()