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