diff --git a/site/db.py b/site/db.py index ab47bc5..b3d79fc 100644 --- a/site/db.py +++ b/site/db.py @@ -7,7 +7,9 @@ DDL → schema.py. Бизнес-запросы → upload.py, extractor.py, api. Функции: _pg_connect(dbname) — сырое подключение к ЛЮБОЙ базе (используется /test createdb) connect() — подключение к ЦЕЛЕВОЙ базе (из DB_NAME) - query(sql, params) — выполнить запрос → (result, error) + query(sql, params) — выполнить SELECT → (result, error) + execute(sql, params) — выполнить INSERT/UPDATE/DELETE → (rowcount, error) + query_one(sql, params) — как query, но возвращает одну строку или None """ import os @@ -63,3 +65,39 @@ def query(sql_text, params=None): except Exception as e: conn.close() return None, str(e) + + +def execute(sql_text, params=None): + """ + Выполнить INSERT/UPDATE/DELETE к целевой БД. + Возвращает (rowcount, None) или (None, error). + """ + conn, err = connect() + if err: + return None, f"connect: {err}" + try: + cur = conn.cursor() + cur.execute(sql_text, params) + conn.commit() + rowcount = cur.rowcount + cur.close() + conn.close() + return rowcount, None + except Exception as e: + conn.rollback() + conn.close() + return None, str(e) + + +def query_one(sql_text, params=None): + """ + Выполнить SELECT и вернуть ПЕРВУЮ строку или None. + Возвращает (row_dict, None) или (None, error). + """ + result, err = query(sql_text, params) + if err: + return None, err + rows = result["rows"] + if not rows: + return None, None # нет строк — не ошибка + return dict(zip(result["columns"], rows[0])), None