[CL-502] trades: ON CONFLICT DO NOTHING на live-INSERT под partial unique index (#502) #527

Closed
andrei wants to merge 0 commits from feature/claude-502-onconflict into master
Owner

Что сделано

  • bot/db_helpers/trades.py: INSERT-ветка с непустым order_id получила ON CONFLICT (order_id) WHERE order_id IS NOT NULL AND order_id <> '' AND is_paper = FALSE DO NOTHING — предикат совпадает с прод-индексом idx_trades_live_order_id_uniq.
  • Тест: перехват SQL через fake-pool (паттерн файла) — INSERT обязан нести ON CONFLICT.

Зачем

Финальный слой #502. Advisory-lock дедуп уже стоял (свежих дублей нет с 02.07); история канонизирована и unique-индекс создан на проде (см. отчёт в issue). Без ON CONFLICT гонка мимо lock-а теперь роняла бы UniqueViolation — вместо этого тихий no-op.

План тестирования

  • TDD: red → green; файл 4/4; полный backend: 7404 passed, 7 skipped, exit 0.

Где могу ошибаться

  • db_save_trade_with_timestamp (исторический синк, order_id='') и paper-пути вне предиката индекса — сознательно не тронуты.

Closes #502

## Что сделано - `bot/db_helpers/trades.py`: INSERT-ветка с непустым `order_id` получила `ON CONFLICT (order_id) WHERE order_id IS NOT NULL AND order_id <> '' AND is_paper = FALSE DO NOTHING` — предикат совпадает с прод-индексом `idx_trades_live_order_id_uniq`. - Тест: перехват SQL через fake-pool (паттерн файла) — INSERT обязан нести ON CONFLICT. ## Зачем Финальный слой #502. Advisory-lock дедуп уже стоял (свежих дублей нет с 02.07); история канонизирована и unique-индекс создан на проде (см. отчёт в issue). Без ON CONFLICT гонка мимо lock-а теперь роняла бы UniqueViolation — вместо этого тихий no-op. ## План тестирования - TDD: red → green; файл 4/4; **полный backend: 7404 passed, 7 skipped, exit 0**. ## Где могу ошибаться - `db_save_trade_with_timestamp` (исторический синк, order_id='') и paper-пути вне предиката индекса — сознательно не тронуты. Closes #502
[CL-502] trades: ON CONFLICT DO NOTHING на live-INSERT — страховка под partial unique index
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 12m7s
Arnold Forgejo CI / frontend-audit (pull_request) Successful in 17s
Arnold Forgejo CI / secret-scan (pull_request) Successful in 3s
Forgejo Smoke Test / Smoke (pull_request) Successful in 1s
8f2a5054e9
Финальный слой #502 поверх advisory-lock дедупа: idx_trades_live_order_id_uniq
(создан CONCURRENTLY на проде после канонизации 42 dup-групп) + ON CONFLICT
с предикатом индекса на INSERT-ветке с непустым order_id. Гонка, прошедшая
мимо lock-а, теперь тихо схлопывается вместо UniqueViolation-краша.
andrei scheduled this pull request to auto merge when all checks succeed 2026-07-22 11:41:33 +00:00
andrei closed this pull request 2026-07-22 11:45:29 +00:00
andrei canceled auto merging this pull request when all checks succeed 2026-07-22 12:12:45 +00:00
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 12m7s
Arnold Forgejo CI / frontend-audit (pull_request) Successful in 17s
Arnold Forgejo CI / secret-scan (pull_request) Successful in 3s
Forgejo Smoke Test / Smoke (pull_request) Successful in 1s

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/arnold-trader-app!527
No description provided.