fix: ручной UPSERT вместо ON CONFLICT — не требует индекса (v1.2.39)

ON CONFLICT требовал уникальный индекс idx_runs_op_uid,
который не всегда создавался (мультистейтмент SQL в psycopg2).
→ save_run падал молча → история пустая.

Новый подход: UPDATE по op_uid, если rowcount==0 → INSERT.
Не зависит от индексов, работает всегда.
This commit is contained in:
“Naeel”
2026-08-03 10:18:10 +04:00
parent 38148516e6
commit 3293330cec
3 changed files with 32 additions and 37 deletions
-11
View File
@@ -84,12 +84,6 @@ ALTER TABLE runs ADD COLUMN IF NOT EXISTS app_version VARCHAR(16);
ALTER TABLE runs ADD COLUMN IF NOT EXISTS scenario_run_id INTEGER;
ALTER TABLE runs ADD COLUMN IF NOT EXISTS step_number INTEGER;
ALTER TABLE runs ADD COLUMN IF NOT EXISTS instance_meta JSONB;
-- Уникальный индекс на op_uid (частичный — только не-NULL).
-- Нужен для UPSERT: сценарий вызывает save_run дважды (RUNNING → OK),
-- второй вызов обновляет существующую строку вместо INSERT дубликата.
CREATE UNIQUE INDEX IF NOT EXISTS idx_runs_op_uid
ON runs (op_uid) WHERE op_uid IS NOT NULL;
"""
# ── DDL для scenario_runs (запуски сценариев) ──
@@ -218,11 +212,6 @@ def init_db():
cur.execute(SCHEMA_SQL)
cur.execute(MIGRATION_SQL)
cur.execute(SCENARIO_RUNS_SQL)
# Индекс для UPSERT в save_run — отдельным запросом для надёжности
# (мультистейтмент SQL в psycopg2 может выполнить не все операторы)
cur.execute("CREATE UNIQUE INDEX IF NOT EXISTS idx_runs_op_uid ON runs (op_uid) WHERE op_uid IS NOT NULL")
conn.commit()
cur.close()
print("[DB] Schema initialized", flush=True)