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

66 lines
1.5 KiB
Python

"""
Connection pool для PostgreSQL (psycopg2).
Lazy-init: пул создаётся при первом обращении к БД в каждом gunicorn-воркере.
Переменные окружения (КАЖДАЯ отдельно):
DB_HOST — хост
DB_PORT — порт (5432)
DB_NAME — имя БД
DB_USER — пользователь
DB_PASSWORD — пароль
DB_SSLMODE — sslmode (require)
"""
import os
import psycopg2
from psycopg2 import pool
_pool = None
_initialized = False
def _dsn():
return (
f"host={os.getenv('DB_HOST')} "
f"port={os.getenv('DB_PORT', '5432')} "
f"dbname={os.getenv('DB_NAME')} "
f"user={os.getenv('DB_USER')} "
f"password={os.getenv('DB_PASSWORD')} "
f"sslmode={os.getenv('DB_SSLMODE', 'require')}"
)
def _ensure_schema():
"""Инициализировать схему при первом обращении к БД."""
global _initialized
if _initialized:
return
_initialized = True
try:
from db.init_db import init_db
init_db()
except Exception:
pass
def get_pool():
global _pool
if _pool is None:
if not os.getenv("DB_USER"):
return None
_pool = pool.ThreadedConnectionPool(1, 5, _dsn())
_ensure_schema()
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)