Skip to content
This repository was archived by the owner on Mar 2, 2025. It is now read-only.

this.db_dw.not_nuller

do- edited this page Sep 28, 2022 · 1 revision

При поточном импорте данных в БД периодически случается такая неприятность, как значение NULL для поля, которое было заявлено как NOT NULL. Посреди потока.

Корректный подход к этой ситуации, конечно, предполагает предварительную проверку и фильтрацию данных, составление протоколов ошибок, их своевременное и ответственное... впрочем, не будем больше описывать этот вариант, так как тема настоящей статьи -- нечто прямо противоположное.

Да, жизнь такова, что иногда может оказаться полезен и допустим такой грубый и циничный образ действий, как замена пустых значений на примерно подходящие непустые:

  • для числовых полей это арифметические нули;
  • для текстовых -- строки нулевой длины;
    • с Oracle, естественно, этот фокус не пройдёт: там, если так делать, придётся использовать строку из нулевого символа или что-то ещё;
  • для дат -- например, начало эры UNIX (1970-01-01);
  • для UUID -- вполне официальный 00000000-0000-0000-0000-000000000000.
Например, при архивации текстовых данных в ClickHouse такая операция представляется вполне оправданной: ведь NULL-флажки там хранятся в практически полноценных дополнительных полях. А с точки зрения бизнес-логики сорта пустых строк неразличимы.

Для того, чтобы реализовать описанное преобразование в соответствии с Моделью для целевой таблицы table_name, достаточно вызова

 db.not_nuller (table_name)

На выходе будет объектный поток-трансформатор, пригодный для подстановки в pipe в сценариях вида

 await db_dw.insert (table, 
  (await db.select_stream (sql, params))
  .pipe (db_dw.not_nuller (table))
 )

И ещё несколько слов о трансформаторе:

  • полей, допускающих значения NULL, он, естественно, не затрагивает никак;
  • для NOT NULL-полей с прописанным в модели DEFAULT -- используется этот DEFAULT;
  • not_nuller подменяет имеющиеся значения null и undefined (всё, что == null), однако не добавляет новых компонент в записи, если они там отсутствуют.

Clone this wiki locally