""" Connection pool для PostgreSQL (psycopg2). Lazy-init: пул создаётся при первом обращении к БД в каждом gunicorn-воркере. Это безопасно для fork-модели — соединения открываются ПОСЛЕ fork. Переменные окружения (отдельно!): DB_HOST — хост (по умолчанию localhost) DB_PORT — порт (по умолчанию 5432) DB_NAME — имя БД (по умолчанию autotest) DB_USER — пользователь DB_PASSWORD — пароль DB_SSLMODE — sslmode (по умолчанию require) """ import os import psycopg2 from psycopg2 import pool _pool = None def _build_dsn(): """Собрать DSN из отдельных переменных окружения.""" return ( f"host={os.getenv('DB_HOST', 'localhost')} " f"port={os.getenv('DB_PORT', '5432')} " f"dbname={os.getenv('DB_NAME', 'autotest')} " f"user={os.getenv('DB_USER', '')} " f"password={os.getenv('DB_PASSWORD', '')} " f"sslmode={os.getenv('DB_SSLMODE', 'require')}" ) def get_pool(): """Lazy-init ThreadedConnectionPool (1-5 соединений).""" global _pool if _pool is None: dsn = _build_dsn() if not os.getenv("DB_USER"): return None # нет креда — нет пула _pool = pool.ThreadedConnectionPool(1, 5, dsn) return _pool def get_conn(): """Взять соединение из пула.""" p = get_pool() return p.getconn() if p else None def put_conn(conn): """Вернуть соединение в пул.""" p = get_pool() if p and conn: p.putconn(conn)