# Редактор скрипта загрузки Скрипт загрузки генерируется автоматически после [выбора источников данных](https://book.winsolutions.ru/books/rukovodstvo-polzovatelya-fastboard/page/vybor-dannyx-dlya-zagruzki). Этап ручного редактирования скрипта загрузки является необязательным, однако функциональность Fastboard позволяет при необходимости внести изменения. ### [![image.png](https://book.winsolutions.ru/uploads/images/gallery/2023-04/scaled-1680-/R5nimage.png)](https://book.winsolutions.ru/uploads/images/gallery/2023-04/R5nimage.png) ### **Правила использования редактора** #### Добавить источник
**Шаги****Ожидаемый результат**
В любом месте скрипта добавить строку *Source "Название коннекта"* где: - Source - ключевое слово обозначающее вставку нового коннекта, - "Название источника" - имя коннекта из списка источников - При вставке кода для импорта таблиц из этого источника таблицы успешно загрузятся в БД проекта
#### Добавить таблицу из источника
**Шаги****Ожидаемый результат**
- Объявить название таблицы: *Table "Car"* - Определить и указать скрипту список полей новой таблицы. Для этого: 1. Описать секцию Create (команда на языке Clickhouse для создания таблицы в БД проекта, в которую запишутся данные из таблицы-источника): *Create @@@ - начало секции CREATE TABLE IF NOT EXISTS - команда КХ на создание таблицы "id" String NULL, - поле таблицы, в которое будет записано значение из источника: "название поля" / тип данных / может ли быть пустым (если нет, not null) "createdAt" DateTime64 (6) NULL, "updatedAt" DateTime64 (6) NULL, ) ENGINE = MergeTree () ORDER BY tuple ()* @@@ *- конец секции Create* 2. Описать секцию Delete (для удаления временной таблицы): *Delete @@@* *ALTER TABLE "Car" DELETE WHERE 1=1* *@@@* 3. Описать секцию Read (Для выбора полей из таблицы-источника: *Read @@@ SELECT - команда (на языке источника) на выбор полей "id"::text, - поле таблицы, которое будет взято из источника. "название поля" / тип данных. Для избежания ошибок при импорте всем полям данной секции прописывается тип ::text "createdAt"::text, "updatedAt::text, FROM "Car" - таблица источника @@@* 4. Описать секцию Write *Write @@@* *INSERT INTO - команда на языке КХ на вставку данных созданную в КХ* *"Car" (* *"id",* *"createdAt",* *"updatedAt"* *)* *@@@* 5. Необязательная секция
*Optimize @@@*
*OPTIMIZE TABLE "Car" DEDUPLICATE*
*@@@* По умолчанию есть.* *Если ее оставить, то произойдет дедубликация полей. Если это действие не требуется, секцию нужно удалить.
6. Убедиться что каждое поле импорта имеет одинаковое название в секциях Create, Read, Write 7. Нажать кнопку «Сохранить». Для сохранения изменений в тексте скрипта 8. Нажать кнопку «Запустить». Для старта импорта данных согласно сохраненному скрипту загрузки
- Добавленная таблица появилась в списке доступных на странице модели данных проекта - Новая таблица содержит все поля указанные в скрипте загрузки - Новая таблица может быть использована в модели данных
#### Удалить таблицу
**Шаги****Ожидаемый результат**
1. Удалить строку объявляющую таблицу *Table "Car"* 2. Удалить секции Create, Delete, Read, Write для этой таблицы 3. Нажать кнопку «Сохранить». Для записи изменений в тексте скрипта 4. Нажать кнопку «Запустить». Для старта импорта данных согласно сохраненному скрипту загрузки Удаленная таблица исчезла из списка таблиц на странице модели данных
#### Добавить поле из таблицы источника в таблицу импорта
**Шаги****Ожидаемый результат**
1. В список полей таблицы куда вставляем секции Create добавить строку: *"id" String NULL - "название поля" / тип данных / может быть пустым Null (если нет, not null)* 2. В список полей таблицы откуда импортируем для секции Read добавить строку с названием поля: *"id"::text - "название поля" / тип данных (всегда текст)* 3. В список полей данной таблицы в секции Write добавить строку с названием поля: *"id" 4. Нажать кнопку «Сохранить». Для записи изменений в тексте скрипта 5. Нажать кнопку «Запустить». Для старта импорта данных согласно сохраненному скрипту загрузки На странице модели данных в данной таблице появилось поле *"id"* с типом данных, указанным в секции Create
#### Удалить поле из таблицы
**Шаги****Ожидаемый результат**
1. В списке полей таблицы в секциях Create, Delete, Read, Write удалить необходимое поле 2. Нажать кнопку «Сохранить». Для записи изменений в тексте скрипта 3. Нажать кнопку «Запустить». Для старта импорта данных согласно сохраненному скрипту загрузки Удаленное поле исчезло таблицы на странице модели данных
#### Изменить тип данных поля
**Шаги****Ожидаемый результат**
1. В строке поля таблицы в секции Create изменить тип на один из поддерживаемых КХ: String, Int64, Float32 и т.д. [Полный список типов](https://clickhouse.com/docs/ru/sql-reference/data-types) 2. Нажать кнопку «Сохранить». Для записи изменений в тексте скрипта 3. Нажать кнопку «Запустить». Для старта импорта данных согласно сохраненному скрипту загрузки Тип поля изменился в таблице

В настоящий момент для применения любых изменений в таблицах (создание поля, переимнование поля, изменение типа поля и т.д.) необходимо пересоздать таблицу в БД проекта. Для этого после внесения всех изменеий к имени таблицы можно добавить, например \_1, после этого сохранить, затем запустить скрипт. При необходимости вернуть таблице старое название тем же способом. *(Это связано с текущими ограничениями парсера. Мы над этим работаем)*

#### Создать вычисляемое поле в таблице
**Шаги****Ожидаемый результат**
При импорте таблицы из источника перед вставкой таблицы в КХ можно создать поле которого нет в исходной таблице, но которое будет вычислено и создано на основе заданного выражения. Для этого: 1. В список полей таблицы в секции Create добавить новую строку с названием, типом, null, например: *"field\_name" Int32 NULL* 2. В секции Read добавить строку вида: *func::text as "field\_name" , где func - вычисляемое выражение, например "field\_name1" + "field\_name2", ::text - тип данных (всегда текст), as "field\_name" - алиaс поля* 3. В список полей данной таблицы в секции Write добавить строку с названием поля: *"field\_name"* 4. Нажать кнопку «Сохранить». Для записи изменений в тексте скрипта 5. Нажать кнопку «Запустить». Для старта импорта данных согласно сохраненному скрипту загрузки В таблице появится поле с назначенным типом данных и рассчитанными по заданному выражению значениями
#### Создать новую таблицу "Календарь" Вставить в скрипт загрузки следующий текст (обратите внимание на комментарии), после выполнения скрипта загрузки выполнить JOIN таблицы Calendar к вашей таблице фактов. ```postgresql Table "calendar" Create @@@ CREATE TABLE IF NOT EXISTS "calendar" ( "id" Int32 NULL, "key_date" String NULL, "date" Date32 NULL, "index_day" Int32 NULL, "day" String NULL, "week" Int32 NULL, "quarter" Int32 NULL, "year" Int32 NULL, "index_month" Int32 NULL, "month" String NULL ) ENGINE = MergeTree () ORDER BY tuple () @@@ Delete @@@ ALTER TABLE "calendar" DELETE WHERE 1=1 @@@ Source "promo_fb (RomanS)" -- Укажите любой существующий источник, чтобы сохранить в него вашу таблицу Read @@@ SELECT a."id"::text, a."key_date"::text, a."date"::text, a."index_day"::text, a."day"::text, a."week"::text, a."quarter"::text, a."year"::text, a."index_month"::text, a."month"::text FROM ( select distinct row_number() over() as id, date(date)::text as key_date, date::date, extract('isodow' from date) as index_day, CASE WHEN extract('isodow' from date) = 1 then 'ПН' -- Если нужно, укажите названия дней (и месяцев ниже) WHEN extract('isodow' from date) = 2 then 'ВТ' WHEN extract('isodow' from date) = 3 then 'СР' WHEN extract('isodow' from date) = 4 then 'ЧТ' WHEN extract('isodow' from date) = 5 then 'ПТ' WHEN extract('isodow' from date) = 6 then 'СБ' WHEN extract('isodow' from date) = 7 then 'ВС' end as day, extract('week' from date) as week, extract('quarter' from date ) as quarter, extract('year' from date) as year, extract('month' from date) as index_month, CASE WHEN extract('month' from date) = 1 then 'Январь' WHEN extract('month' from date) = 2 then 'Февраль' WHEN extract('month' from date) = 3 then 'Март' WHEN extract('month' from date) = 4 then 'Апрель' WHEN extract('month' from date) = 5 then 'Май' WHEN extract('month' from date) = 6 then 'Июнь' WHEN extract('month' from date) = 7 then 'Июль' WHEN extract('month' from date) = 8 then 'Август' WHEN extract('month' from date) = 9 then 'Сентябрь' WHEN extract('month' from date) = 10 then 'Октябрь' WHEN extract('month' from date) = 11 then 'Ноябрь' WHEN extract('month' from date) = 12 then 'Декабрь'end as month from generate_series(date'2015-01-01',date(now()),interval '1 day')as t(date) -- Выберите дату начала и интервал order by date desc) a @@@ ``` Таблица в результате: [![image.png](https://book.winsolutions.ru/uploads/images/gallery/2023-09/scaled-1680-/FLEimage.png)](https://book.winsolutions.ru/uploads/images/gallery/2023-09/FLEimage.png) ### **Некоторые особенности работы разными типами источников** #### **MS SQL** 1\. При импорте данных с типом «Дата» нужно будет поля с датами в секции READ для этой таблицы сконвертировать в строку. КХ сам сконвертирует тип дата при создании таблицы у себя и они снова станут датами [![image.png](https://book.winsolutions.ru/uploads/images/gallery/2023-11/scaled-1680-/qS6image.png)](https://book.winsolutions.ru/uploads/images/gallery/2023-11/qS6image.png) 2\. Поля с кодировкой UTF16 (тип varchar) нужно будет обернуть в cast. В той же секции @READ для этой таблицы. Иначе русскоязычные значения не распознаются в этих полях и появятся вопросительные знаки [![image.png](https://book.winsolutions.ru/uploads/images/gallery/2023-11/scaled-1680-/LiPimage.png)](https://book.winsolutions.ru/uploads/images/gallery/2023-11/LiPimage.png)