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:
+39
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user