import os import psycopg2 from psycopg2 import sql def connect(): """Подключение к БД. Возвращает connection или None.""" try: return psycopg2.connect( host=os.getenv("DB_HOST"), port=os.getenv("DB_PORT", 5432), dbname=os.getenv("DB_NAME"), user=os.getenv("DB_USER"), password=os.getenv("DB_PASS"), sslmode=os.getenv("DB_SSLMODE", "disable"), ) except Exception: return None def query(sql_text, params=None): """Выполнить запрос, вернуть (rows, columns) или (None, error).""" conn = connect() if not conn: return None, "no connection" try: cur = conn.cursor() cur.execute(sql_text, params) rows = cur.fetchall() cols = [desc[0] for desc in cur.description] if cur.description else [] cur.close() conn.close() return {"columns": cols, "rows": [list(r) for r in rows]}, None except Exception as e: conn.close() return None, str(e)