"""Синхронное подключение к PostgreSQL для Celery воркеров.""" import logging from contextlib import contextmanager from typing import Generator import redis as redis_lib from sqlalchemy import create_engine from sqlalchemy.orm import Session, sessionmaker from app.config import settings logger = logging.getLogger(__name__) # Синхронный движок для воркеров (psycopg2) engine = create_engine( settings.database_url_sync, pool_size=5, max_overflow=10, pool_pre_ping=True, pool_recycle=3600, ) SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False) @contextmanager def db_session() -> Generator[Session, None, None]: """Контекстный менеджер для сессии БД.""" session = SessionLocal() try: yield session session.commit() except Exception: session.rollback() raise finally: session.close() # Redis клиент для кэширования результатов поиска _redis_client: redis_lib.Redis | None = None def get_redis() -> redis_lib.Redis: """Получить или создать Redis клиент.""" global _redis_client if _redis_client is None: _redis_client = redis_lib.from_url(settings.REDIS_URL, decode_responses=True) return _redis_client