fix(site_finder): Россети — стабильный ключ вместо сессионного fid, дедуп power_supply_centers ×10 → ~481 #3329
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3329
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3322-rosseti-stable-key"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #3322. Аудит 01-02.09, линза ptica-workers:
ON CONFLICT (source, external_id)не сработал ни разу за историю —_stable_external_idбралfeature['id'], сессионный fid GeoServer. 4880 строк / 481 уникальная ПС.Лоадер
_stable_external_idбольше не смотрит на fid вообще. Ключ (байт-в-байт одинаков в питоне и SQL):Координаты — целые в единицах 1e-5° (half-away-from-zero), не форматированный float: текстовое представление double в питоне и PG расходится, целое — нет. sha256, а не sha1: встроен в PG16, sha1 требовал бы pgcrypto.
Бэкфилл
data/sql/99c_power_supply_centers_dedup.sqlВесь в SQL:
sc_name_norm/voltage_classуже лежат готовыми колонками (их писал тот же питон-код), SQL только конкатенирует +ST_X/ST_Y— расхождению взяться неоткуда, и не нужен ручной второй шаг. Победитель дублей —ORDER BY fetched_at DESC NULLS LAST, id DESC(NULLS LAST явно — DESC в PG по умолчанию NULLS FIRST). Резервы не теряются: reserve-лоадеры пишутUPDATE ... WHERE sc_name_norm=...— во все копии сразу.RAISE NOTICEпечатает было/стало/удалено,RAISE WARNINGесли осталось >700. Идемпотентно (IS DISTINCT FROM, группировка по новому ключу).Остаточный риск записан в шапке миграции: если
normalize_sc_nameизменится позже, старыеsc_name_normразъедутся с новыми ключами — файл идемпотентен, повторный прогон чинит.Порядок обязателен: миграция → код (едет так деплоем автоматически). Наоборот weekly-прогон вставил бы третий комплект.
Тесты
45 passedв test_connection_capacity_loaders.py; ruff чист; гейт lock_timeout зелёный (40 миграций). Фальсификация (git apply -Rлоадера): 3 теста красные ПО ЗНАЧЕНИЮ ('fid--x' != 'h:eb91917f35aff23f'— в ключ протекает fid); тест_coord_e5из отката исключён сознательно — он дал бы AttributeError, «нет возможности», а не «значение неверно».Прод-приёмка после деплоя (сделаю отдельно)
count(*) == count(distinct external_id);count(*) WHERE external_id NOT LIKE 'h:%'= 0 (иначе формулы разошлись);