- Зачем:
- студент реализует 9 объектов DWH без автоматической обратной связи;
- ошибки (NULL в PK, дубли BK, сломанный SCD2) обнаруживались только на слое DM
через 2–3 слоя, где отладка многократно сложнее.
- Что:
- создан DAG bookings_validate.py — три параллельных TaskGroup (validate_ods,
validate_dds, validate_dm), schedule=None (только ручной trigger);
- создано 17 SQL-скриптов в sql/validate/: ODS BK coverage vs STG-батч,
согласованность _load_id между ods.airplanes и ods.seats, дубли BK, NULL в PK,
покрытие ODS→DDS для измерений (dim_routes требует открытой версии valid_to IS NULL),
SCD2 активный тест backup→mutate→student_load→check(5 инвариантов)→restore
(trigger_rule=all_done), проверка «дыр» между SCD2-версиями,
exists-чеки для 4 DM-витрин;
- добавлен класс TestBookingsValidate (5 smoke-тестов) в tests/test_dags_smoke.py.
- Проверка:
- make test — 4 passed, 14 skipped (DAG-тесты скипаются без Airflow, норма);
- ручной trigger bookings_validate в Airflow UI на solution-ветке — все таски зелёные.
23 lines
1020 B
SQL
23 lines
1020 B
SQL
-- Проверка: нет дублей по passenger_id в dds.dim_passengers.
|
|
--
|
|
-- Отдельный таск для точной диагностики — студент сразу видит причину проблемы.
|
|
-- Типичная ошибка: INSERT без проверки EXISTS при SCD1-загрузке.
|
|
DO $$
|
|
DECLARE
|
|
v_dup BIGINT;
|
|
BEGIN
|
|
SELECT COUNT(*) INTO v_dup
|
|
FROM (
|
|
SELECT passenger_id FROM dds.dim_passengers
|
|
GROUP BY passenger_id HAVING COUNT(*) > 1
|
|
) AS d;
|
|
|
|
IF v_dup > 0 THEN
|
|
RAISE EXCEPTION E'FAILED: dds.dim_passengers содержит % дублирующихся passenger_id.\n'
|
|
'Подсказка: при SCD1 нужно INSERT ... WHERE NOT EXISTS или ON CONFLICT DO NOTHING/UPDATE.\n'
|
|
'Если таск check_dim_passengers_exists тоже упал — начните с него.', v_dup;
|
|
END IF;
|
|
|
|
RAISE NOTICE 'PASSED: Нет дублей по passenger_id в dds.dim_passengers';
|
|
END $$;
|