Инициализация данных
Введение
С Netuno разработка приложений начинается прежде всего с построения базы данных через создание форм и полей.
И когда работают в команде или нужно перенести разработку приложения в другую среду, необходимо создать резервную копию базы данных вместе с кодом.
Таким образом, в целевой среде потребуется заново настроить базу данных, и тогда приложение сможет выполняться так, как оно было разработано в исходной среде.
Проблема этого процесса — необходимость всегда помнить о создании новой резервной копии при каждом изменении в базе данных. И чем больше людей участвует в разработке и/или чем больше сред для публикации приложения, тем сложнее становится этот процесс.
Поэтому Netuno, чтобы решить эту проблему, предлагает систему инициализации приложений, которая автоматически генерирует структуру базы данных (схема), а дополнительно позволяет вручную запрограммировать загрузку начальных данных через дополнительные скрипты.
Она также позволяет изменить тип сервера базы данных, гарантируя, что инициализация будет выполнена нормально, а приложение — без каких-либо проблем. Это означает, что приложение можно разрабатывать на H2DataBase, и с автоматически сгенерированными схемами можно изменить подключение базы данных приложения на PostgreSQL или MariaDB. При первом запуске приложения на новой базе данных всё будет восстановлено независимо от изменения типа сервера базы данных.
Таким образом, это позволяет полностью изменить базу данных без влияния на уже выполненную разработку.
Файлы программирования инициализации находятся внутри папки приложения в:
server/setup
Конфигурация инициализации
В настройках среды приложений, которые находятся в:
/apps/МОЕ_ПРИЛОЖЕНИЕ/config/_development.json/apps/МОЕ_ПРИЛОЖЕНИЕ/config/_production.json
Вы можете управлять поведением 'setup' с помощью настроек:
...
"setup": {
"enabled": true,
"schema": {
"auto_create": true,
"execution": true
},
"scripts": {
"execution": true
}
},
...
enabled: boolean > по умолчанию true
Определяет, активна ли инициализация, и таким образом включает или отключает при первом запуске приложения выполнение операций инициализации данных.
schema.auto_create: boolean > по умолчанию true
Позволяет Netuno знать, должен ли он генерировать файлы схемы базы данных всякий раз, когда создаётся или изменяется какая-либо форма или поле.
schema.execution: boolean > по умолчанию true
Управляет тем, должна ли схема выполняться во время операций инициализации, выполняемых при первом запуске приложения.
scripts.execution: boolean > по умолчанию true
Включает или отключает выполнение дополнительных скриптов во время операций инициализации, выполняемых при первом запуске приложения.
Схема
Во время создания или изменения форм и полей в веб-интерфейсе Netuno будут генерироваться файлы схемы внутри папки setup следующим образом:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/setup/_schema-ИМЯ_ФОРМЫ.js
server/setup/_schema-ИМЯ_ФОРМЫ.ts
server/setup/_schema-ИМЯ_ФОРМЫ.py
server/setup/_schema-ИМЯ_ФОРМЫ.rb
server/setup/_schema-ИМЯ_ФОРМЫ.kts
server/setup/_schema-ИМЯ_ФОРМЫ.groovy
Где для каждой существующей в приложении формы будет файл _schema-***.
Эти файлы не следует изменять вручную, поскольку они автоматически генерируются Netuno.
Таким образом, если вы измените содержимое этих файлов, при следующей генерации схем они будут автоматически заменены, а изменения, сделанные непосредственно в файлах, будут потеряны.
Чтобы автоматическая генерация схемы базы данных выполнялась, необходимо убедиться, что настройка schema.auto_create активна и что папка setup существует внутри папки server.
Скрипты
Скрипты специально запрограммированного кода — это файлы, расположенные в папке setup, которые не начинаются с _.
Основная цель этих скриптов — загружать данные, гарантируя, что база данных содержит минимум информации, необходимый для корректной работы приложения.
Таким образом, когда приложение будет перенастроено в другой среде, оно автоматически загрузится с начальными данными и будет готово к началу использования.
Для выполнения этих операций загрузки данных следует использовать функции ресурса _db.
Скрипты выполняются после выполнения схем в алфавитно-цифровом порядке имён файлов, которые не начинаются с _.
Начинать имена файлов с числовой последовательности — идеальный способ определить порядок выполнения, поэтому пользовательские скрипты выполняются в порядке имён файлов, которые не начинаются с
_.
Вставка пользовательских данных
И чтобы избавить от работы по выполнению запросов к базе данных для проверки, можно ли выполнить insert данных или нет, Netuno предоставляет функцию insertIfNotExists.
Эта функция проверяет, существуют ли данные точно в том виде, в каком они определены в базе данных; если их нет, то выполняет их создание.
Пример её использования — загрузка полей Код и Название формы Тип территории, где имя таблицы — тип_территория, и у неё есть столбцы код и название; для этого достаточно создать файл со следующим содержимым:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1001")
.set("название", "Континентальный")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1002")
.set("название", "Архипелажный")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "2003")
.set("название", "Морской")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "3004")
.set("название", "Воздушный")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1001")
.set("название", "Континентальный")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1002")
.set("название", "Архипелажный")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "2003")
.set("название", "Морской")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "3004")
.set("название", "Воздушный")
);
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1001")
.set("название", "Континентальный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1002")
.set("название", "Архипелажный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "2003")
.set("название", "Морской")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "3004")
.set("название", "Воздушный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1001")
.set("название", "Континентальный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1002")
.set("название", "Архипелажный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "2003")
.set("название", "Морской")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "3004")
.set("название", "Воздушный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1001")
.set("название", "Континентальный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1002")
.set("название", "Архипелажный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "2003")
.set("название", "Морской")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "3004")
.set("название", "Воздушный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1001")
.set("название", "Континентальный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "1002")
.set("название", "Архипелажный")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "2003")
.set("название", "Морской")
)
_db.insertIfNotExists("тип_территория", _val.map()
.set("код", "3004")
.set("название", "Воздушный")
)
Цикл обработки
Как уже объяснялось, инициализация выполняется только при первом запуске приложения.
И порядок выполнения:
_start— выполняет файл инициализации, который может содержать любой тип пользовательского программирования:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_start.js
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_start.ts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_start.py
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_start.rb
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_start.kts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_start.groovy
_cleanup— выполняет удаление форм, отчётов и соответствующих полей программно:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_cleanup.js
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_cleanup.ts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_cleanup.py
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_cleanup.rb
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_cleanup.kts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_cleanup.groovy
_schema-*— выполняет все скрипты с префиксом _schema-, содержит команды создания форм, отчётов и соответствующих полей:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-структура_автогенерированная.jsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-категория.jsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-товар.jsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-клиент.js
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-структура_автогенерированная.tsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-категория.tsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-товар.tsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-клиент.ts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-структура_автогенерированная.pyМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-категория.pyМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-товар.pyМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-клиент.py
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-структура_автогенерированная.rbМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-категория.rbМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-товар.rbМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-клиент.rb
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-структура_автогенерированная.ktsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-категория.ktsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-товар.ktsМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-клиент.kts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-структура_автогенерированная.groovyМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-категория.groovyМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-товар.groovyМОЕ_ПРИЛОЖЕНИЕ/server/setup/_schema-клиент.groovy
001-другие_скрипты— выполняет файлы специально запрограммированных скриптов; это все файлы, которые не начинаются с_и которые, вероятно, будут содержать inserts необходимых начальных данных или другие пользовательские разработки, например:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
МОЕ_ПРИЛОЖЕНИЕ/server/setup/001-вставка_пользовательских_данных.jsМОЕ_ПРИЛОЖЕНИЕ/server/setup/002-категория.jsМОЕ_ПРИЛОЖЕНИЕ/server/setup/003-товар.jsМОЕ_ПРИЛОЖЕНИЕ/server/setup/004-клиент.js
МОЕ_ПРИЛОЖЕНИЕ/server/setup/001-вставка_пользовательских_данных.tsМОЕ_ПРИЛОЖЕНИЕ/server/setup/002-категория.tsМОЕ_ПРИЛОЖЕНИЕ/server/setup/003-товар.tsМОЕ_ПРИЛОЖЕНИЕ/server/setup/004-клиент.ts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/001-вставка_пользовательских_данных.pyМОЕ_ПРИЛОЖЕНИЕ/server/setup/002-категория.pyМОЕ_ПРИЛОЖЕНИЕ/server/setup/003-товар.pyМОЕ_ПРИЛОЖЕНИЕ/server/setup/004-клиент.py
МОЕ_ПРИЛОЖЕНИЕ/server/setup/001-вставка_пользовательских_данных.rbМОЕ_ПРИЛОЖЕНИЕ/server/setup/002-категория.rbМОЕ_ПРИЛОЖЕНИЕ/server/setup/003-товар.rbМОЕ_ПРИЛОЖЕНИЕ/server/setup/004-клиент.rb
МОЕ_ПРИЛОЖЕНИЕ/server/setup/001-вставка_пользовательских_данных.ktsМОЕ_ПРИЛОЖЕНИЕ/server/setup/002-категория.ktsМОЕ_ПРИЛОЖЕНИЕ/server/setup/003-товар.ktsМОЕ_ПРИЛОЖЕНИЕ/server/setup/004-клиент.kts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/001-вставка_пользовательских_данных.groovyМОЕ_ПРИЛОЖЕНИЕ/server/setup/002-категория.groovyМОЕ_ПРИЛОЖЕНИЕ/server/setup/003-товар.groovyМОЕ_ПРИЛОЖЕНИЕ/server/setup/004-клиент.groovy
- _end — выполняет файл завершения, который может содержать любой тип пользовательского программирования:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_end.js
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_end.ts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_end.py
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_end.rb
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_end.kts
МОЕ_ПРИЛОЖЕНИЕ/server/setup/_end.groovy
То есть допускается создание пользовательского кода в скриптах start и end для выполнения некоторых операций, которые имеет смысл выполнять до инициализации или даже после её завершения.
Следует подчеркнуть, что этот цикл обработки выполняется всякий раз, когда приложение запускается впервые, поэтому необходимо гарантировать проверку существования данных перед их созданием.
Убедитесь, что следующие настройки среды активны, чтобы разрешить выполнение этого процесса в файлах МОЕ_ПРИЛОЖЕНИЕ/config/_development.json или МОЕ_ПРИЛОЖЕНИЕ/config/_production.json в зависимости от среды:
-
Полностью включает или отключает выполнение любой операции инициализации:
setup.enabled = true|false -
Включает или отключает выполнение _schemas-:
setup.schema.execution = true|false -
Включает или отключает выполнение скриптов:
setup.scripts.execution = true|false
Очистка
Чтобы запрограммировать удаление форм и полей, нужно использовать скрипт _cleanup.js, что гарантирует: во всех средах, синхронизирующих файлы проекта, при выполнении инициализации структура будет удалена, если она существует.
Пример скрипта очистки:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Удаляет форму зона:
_form.dropIfExists("зона");
// Удаляет поле подобласть_id формы область:
_form.dropFieldIfExists("область", "подобласть_id");
// Удаляет форму зона:
_form.dropIfExists("зона");
// Удаляет поле подобласть_id формы область:
_form.dropFieldIfExists("область", "подобласть_id");
# Удаляет форму зона:
_form.dropIfExists("зона")
# Удаляет поле подобласть_id формы область:
_form.dropFieldIfExists("область", "подобласть_id")
# Удаляет форму зона:
_form.dropIfExists("зона")
# Удаляет поле подобласть_id формы область:
_form.dropFieldIfExists("область", "подобласть_id")
// Удаляет форму зона:
_form.dropIfExists("зона")
// Удаляет поле подобласть_id формы область:
_form.dropFieldIfExists("область", "подобласть_id")
// Удаляет форму зона:
_form.dropIfExists("зона")
// Удаляет поле подобласть_id формы область:
_form.dropFieldIfExists("область", "подобласть_id")
DBML
Всякий раз, когда Netuno выполняет инициализацию данных, генерируется файл:
server/setup/_db-schema.dbml
Это файл со всей структурой данных, который можно использовать с искусственным интеллектом.
На основе содержимого DBML искусственный интеллект понимает структуру данных и может генерировать точные SQL-запросы.
Попробуйте использовать этот файл как вложение в промпте и попросите сгенерировать сложные SQL-запросы — вы сможете получить хорошие результаты.
Заключение
Процесс инициализации приложений в Netuno имеет следующие основные функции:
- _schema-: автоматически генерирует всю структуру форм и отчётов с их соответствующими полями, что позволяет гарантировать согласованность всей структуры базы данных приложения, особенно когда приложение выполняется с новой пустой базой данных.
- скрипты: выполнять операции с базой данных, чтобы гарантировать, что приложение содержит обязательные данные, предварительно загруженные, всякий раз, когда оно запускается впервые.
Таким образом, Netuno позволяет приложениям работать в новых средах, даже если изменён тип базы данных, гарантируя корректную работу приложения без необходимости выполнять backups и restore баз данных.
Дополнительно это позволяет, чтобы весь код конфигурации, сгенерированный автоматически и вручную, версионировался, например, с помощью GIT.