Миграция базы данных
Миграция схемы базы данных, или сокращенно миграция базы данных, – это процесс обновления схемы базы данных в соответствии с изменениями модели данных приложения.
Jmix использует Liquibase в качестве инструмента миграции базы данных.
Процесс
Jmix Studio создает скрипты миграции в формате Liquibase changelog, сравнивая текущее состояние сущностей JPA с текущей схемой базы данных соответствующего хранилища данных. Это происходит автоматически при запуске приложения с использованием конфигурации Run/Debug. Файл changelog сохраняется в исходном коде приложения и собирается в составе бинарного артефакта.
Генерацию Liquibase changelog можно отключить, открыв на редактирование Run/Debug configuration и удалив шаг Check Jmix Database, выполняющийся перед запуском. |
Когда приложение запускается, оно автоматически запускает Liquibase со сгенерированными changelog для обновления подключенной базы данных.
Вы также можете в любое время создать changelog с помощью действия Generate Diff Changelog и выполнить его с помощью действия Update в хранилище данных в окне инструментов Studio Jmix. |
Дополнения, от которых зависит ваше приложение, также могут содержать файлы Liquibase changelog. Файлы changelog из зависимостей выполняются в базе данных раньше, чем в приложении.
Структура файлов changelog
Studio генерирует файлы changelog в каталоге src/main/resources/<base_package>/liquibase
проекта приложения. Там Studio создает каталог changelog
для основного хранилища данных и каталоги <store>-changelog
для дополнительных хранилищ данных. Файлы changelog создаются в подкаталогах, соответствующих году и месяцу текущей даты. Имя каждого файла включает текущий день, порядковый номер в течение дня и случайную последовательность символов, чтобы избежать конфликтов, если несколько разработчиков работают над одним и тем же проектом.
├── liquibase/ (1)
│ ├── changelog/ (2)
│ │ ├── 010-init-user.xml (3)
│ │ └── 2020/
│ │ ├── 11/
│ │ │ ├── 12-010-fe2b82e6.xml (4)
│ │ │ └── 27-010-fe2b82e6.xml
│ │ └── 12/
│ │ └── 17-010-fe2b82e6.xml
│ ├── changelog.xml (5)
│ ├── locations-changelog/ (6)
│ │ └── 2020/
│ │ └── 11/
│ │ ├── 25-010-fe2b82e6.xml
│ │ └── 28-010-fe2b82e6.xml
│ └── locations-changelog.xml (7)
1 | Корень структуры файлов changelog Liquibase. |
2 | Каталог файлов changelog основного хранилища данных. |
3 | Файл changelog, предоставляемый в новом проекте. Он создает таблицу для сущности User . |
4 | Файлы changelog, которые генерирует Studio. |
5 | Корневой файл changelog основного хранилища данных. |
6 | Каталог файлов changelog хранилища данных locations . |
7 | Корневой файл changelog хранилища данных locations . |
Для каждого хранилища данных существует корневой файл changelog, расположенный в каталоге src/main/resources/<base_package>/liquibase
. Он содержит директиву для включения всех сгенерированных файлов changelog в подкаталог changelog
.
Корневой файл Liquibase changelog для главного хранилища содержит директивы include
для файлов changelog всех дополнений, используемых в проекте. Это делает changelog совместимым с плагином Gradle для Liquibase и Liquibase CLI, что позволяет запускать Liquibase вне Studio и приложения, например на сервере CI.
Проект должен содержать свойство
|
Studio поддерживает включения автоматически при добавлении и удалении дополнений. Кроме того, при старте приложения Studio проверяет что включения в корневом changelog соответствуют дополнениям, используемым в проекте. При обнаружении расхождения отображается диалог с рекомендациями. Определенные пути можно добавить в игнорируемые, чтобы не получать о них уведомление впредь.
Корневой файл changelog передается в Liquibase, когда приложение или Studio запускают миграцию базы данных.
Вы можете написать файлы changelog Liquibase вручную и поместить их в структуру, описанную выше. Liquibase выполняет включенные файлы changelog в алфавитном порядке, учитывая их полный путь, поэтому давайте файлам соответствующие имена.
Никогда не удаляйте корневой файл changelog.xml , так как он требуется для запуска процесса миграции. Кроме того, не удаляйте файл changelog/010-init-user.xml если не собираетесь реализовывать нестандартную систему безопасности.
|
Настройка Liquibase
Вы можете настроить свойства Liquibase для основного хранилища данных в application.properties
таким же образом, как описано в документации Spring Boot (см. свойства spring.liquibase.*
), но заменяя префикс spring.liquibase
на main.liquibase
, например:
main.liquibase.enabled = false
Для дополнительного хранилища данных замените main
в имени свойства именем этого хранилища.
Файл
|
По умолчанию, Jmix Studio сравнивает с моделью данных все таблицы базы данных, и генерирует скрипты миграции, включающие команды DROP TABLE
для таблиц, не отображенных на сущности. Если в вашей базе данных есть таблицы, не связанные с сущностями приложения, вы можете проигнорировать их, указав их префиксы или имена целиком через запятую в свойстве main.datasource.studio.liquibase.exclude-prefixes
. Например:
main.datasource.studio.liquibase.exclude-prefixes = abc_,foo,bar