Выполнение произвольных скрптов при обновлении БД#
Стандартного механизма обновления БД не всегда достаточно, когда речь идет о наполнении справочников или сложных изменениях в структуре БД. Для таких задач была добавлена возможность выполнения произвольных скриптов, позволяющая гибко управлять состоянием базы.
Создание файлов миграции#
Для реализации кастомной логики обновления необходимо создать объект миграции в директории sqlScripts. Эта папка должна находиться в корне исходников прикладной библиотеки или проекта (по умолчанию — папка source). Поддерживается использование вложенных папок для структуризации.
Структура объекта миграции#
Объект миграции всегда состоит из двух файлов: файла описания и SQL-скрипта.
- Файл описания - содержит метаданные и настройки запуска. Должен иметь расширение
.migration.json. - SQL-скрипт - содержит непосредственно логику миграции. Должен иметь расширение
.sql.
Предупреждение
Путь к файлу описания используется как уникальный идентификатор обновления. Не переименовывайте файл и не изменяйте его путь после выполнения миграции, иначе система посчитает его новым и запустит скрипт повторно.
Формат файла описания#
Пример содержимого файла example.migration.json:
- description - текст описания миграции (будет отображаться в интерфейсе обновления БД).
- executionPolicy - определяет сбособ выполнения скрипта:
onChange- скрипт выполнится, если он еще не запускался, либо если в содержимое SQL-файла были внесены изменения.once- скрипт выполнится один раз.always- скрипт будет выполняться при каждом запуске обновления.
- script - относительный путь к SQL-файлу с логикой миграции.
- priority - приоритет выполнения. Чем меньше число, тем раньше выполнится скрипт. По умолчанию
100.
Пример sql-файла ./transferData.sql:
Подключение файлов миграции из прикладных библиотек#
Если вы устанавливаете прикладные бибилотеки, которые содержат собственные произвольные миграции, их необходимо подключить в файле внешних зависимостей external-manual.json. В разделе sqlScripts необходимо указать пути к файлам описания миграций из соответствующих пакетов.
Пример файла external-manual.json:
Важные особенности#
- Учитывайте, что миграция может запускаться в двух разных сценариях:
- На новом проекте: где структура БД создается с нуля.
- На существующем проекте: где база уже наполнена данными и имеет определенную структуру.
Ваш скрипт должен корректно отрабатывать в обоих случаях.
- Пишите скрипты так, чтобы их многократный запуск не приводил к ошибкам. Это особенно важно для политики
onChange. Примеры:- при изменении типа колонки проверяйте текущее состояние через системные таблицы.
- при заполнении справочников используйте конструкции, предотвращающие дублирование.
- Система не оборачивает выполнение скриптов в транзакцию автоматически. Если логика миграции требует атомарности (выполнения всех команд как единого целого), необходимо самостоятельно прописывать операторы транзакций (
BEGIN TRANSACTION,COMMIT,ROLLBACK) внутри вашего SQL-скрипта.
Выполнение скриптов#
Скрипты выполняются на форме обновления БД /dev#/view/migration