feat(db): execute() + query_one() — INSERT/UPDATE/DELETE и единичный SELECT

- execute(sql, params) → (rowcount, error) — для INSERT/UPDATE/DELETE
- query_one(sql, params) → (dict, error) — первая строка как словарь
- авто-commit и rollback при ошибке
This commit is contained in:
2026-06-14 06:11:02 +04:00
parent cbfba0bc54
commit ba2e8552e7
+39 -1
View File
@@ -7,7 +7,9 @@ DDL → schema.py. Бизнес-запросы → upload.py, extractor.py, api.
Функции: Функции:
_pg_connect(dbname) — сырое подключение к ЛЮБОЙ базе (используется /test createdb) _pg_connect(dbname) — сырое подключение к ЛЮБОЙ базе (используется /test createdb)
connect() — подключение к ЦЕЛЕВОЙ базе (из DB_NAME) 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 import os
@@ -63,3 +65,39 @@ def query(sql_text, params=None):
except Exception as e: except Exception as e:
conn.close() conn.close()
return None, str(e) 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