From ba2e8552e7b05ceeea22d2418324fc0fa6c88a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 14 Jun 2026 06:11:02 +0400 Subject: [PATCH] =?UTF-8?q?feat(db):=20execute()=20+=20query=5Fone()=20?= =?UTF-8?q?=E2=80=94=20INSERT/UPDATE/DELETE=20=D0=B8=20=D0=B5=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D1=87=D0=BD=D1=8B=D0=B9=20SELECT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - execute(sql, params) → (rowcount, error) — для INSERT/UPDATE/DELETE - query_one(sql, params) → (dict, error) — первая строка как словарь - авто-commit и rollback при ошибке --- site/db.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) 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