gendesign/tradein-mvp/backend/data/sql/003_seed_deals.sql
TradeIn Deploy fb49c56b81 fix(tradein): убрать TRUNCATE из seed — деплой больше не wipe-ит данные
КРИТИЧНЫЙ БАГ: 003_seed_listings.sql содержал TRUNCATE listings,deals,
а deploy-tradein.yml гоняет весь data/sql/*.sql на каждом деплое →
каждый деплой стирал реальные данные парсеров и подсовывал 120 синтетики.

Удалён 003_seed_listings.sql. Вместо него 003_seed_deals.sql —
идемпотентный (INSERT ... WHERE NOT EXISTS), сидит ТОЛЬКО сделки и
ТОЛЬКО когда таблица deals пуста. listings больше не трогается seed-ом.
2026-05-21 13:19:24 +03:00

54 lines
2.1 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Trade-In MVP — идемпотентный сид СДЕЛОК (deals).
--
-- ВАЖНО: этот файл применяется на КАЖДОМ деплое (deploy-tradein.yml гоняет
-- весь data/sql/*.sql). Поэтому:
-- 1. НЕ трогает listings — реальные данные парсеров не должны затираться.
-- 2. Вставляет сделки ТОЛЬКО если таблица deals пуста (WHERE NOT EXISTS).
-- На втором и последующих деплоях SELECT вернёт 0 строк → no-op.
--
-- 80 синтетических сделок (Росреестр/ДомКлик) в центре ЕКБ — для страницы 3
-- PDF-отчёта. Реальные сделки появятся когда подключим дамп rosreestr_deals.
INSERT INTO deals (
source, dedup_hash, address, lat, lon, geom,
rooms, area_m2, floor, total_floors, year_built,
price_rub, price_per_m2, deal_date, days_on_market
)
SELECT
CASE WHEN random() < 0.6 THEN 'rosreestr' ELSE 'domklik' END,
md5('seed-deal:' || i::text || ':' || rooms_pick::text || ':' || area_pick::text),
'Екатеринбург, реальная сделка',
lat, lon,
ST_SetSRID(ST_MakePoint(lon, lat), 4326),
rooms_pick,
area_pick,
(1 + (random() * 15)::int),
(3 + (random() * 15)::int),
(1965 + (random() * 60)::int),
(ppm2 * area_pick)::int,
ppm2,
NOW() - (random() * 365 || ' days')::interval,
(15 + (random() * 90)::int)
FROM (
SELECT
i, lat, lon, rooms_pick,
CASE rooms_pick
WHEN 1 THEN (28 + random() * 17)::numeric(10,2)
WHEN 2 THEN (40 + random() * 25)::numeric(10,2)
WHEN 3 THEN (58 + random() * 30)::numeric(10,2)
END AS area_pick,
(110000 + random() * 70000)::int AS ppm2
FROM (
SELECT
gs AS i,
56.8354 + (random() - 0.5) * 0.026 AS lat,
60.6172 + (random() - 0.5) * 0.050 AS lon,
CASE
WHEN random() < 0.3 THEN 1
WHEN random() < 0.8 THEN 2
ELSE 3
END AS rooms_pick
FROM generate_series(1, 80) gs
) random_lots
) generated
WHERE NOT EXISTS (SELECT 1 FROM deals LIMIT 1);