66 lines
1.5 KiB
Python
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)
|