КРИТИЧНЫЙ БАГ: 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-ом.
54 lines
2.1 KiB
SQL
54 lines
2.1 KiB
SQL
-- 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);
|