import os import psycopg2 from psycopg2 import sql def connect(): """Подключение к БД. Возвращает (connection, None) или (None, error).""" try: conn = 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"), ) return conn, None except Exception as e: return None, str(e) def query(sql_text, params=None): """Выполнить запрос, вернуть (result, error).""" conn, err = connect() if err: return None, f"connect: {err}" 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)