Files
app-autotest/site/db/pool.py
T

57 lines
1.7 KiB
Python

"""
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)