-
Notifications
You must be signed in to change notification settings - Fork 17
this.db_dw.not_nuller
При поточном импорте данных в БД периодически случается такая неприятность, как значение NULL для поля, которое было заявлено как NOT NULL. Посреди потока.
Корректный подход к этой ситуации, конечно, предполагает предварительную проверку и фильтрацию данных, составление протоколов ошибок, их своевременное и ответственное... впрочем, не будем больше описывать этот вариант, так как тема настоящей статьи -- нечто прямо противоположное.
Да, жизнь такова, что иногда может оказаться полезен и допустим такой грубый и циничный образ действий, как замена пустых значений на примерно подходящие непустые:
- для числовых полей это арифметические нули;
- для текстовых -- строки нулевой длины;
- с Oracle, естественно, этот фокус не пройдёт: там, если так делать, придётся использовать строку из нулевого символа или что-то ещё;
- для дат -- например, начало эры UNIX (1970-01-01);
- для UUID -- вполне официальный 00000000-0000-0000-0000-000000000000.
Для того, чтобы реализовать описанное преобразование в соответствии с Моделью для целевой таблицы 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), однако не добавляет новых компонент в записи, если они там отсутствуют.