5.5.1. Создание схемы БД

В процессе разработки приложения возникает необходимость создания и поддержания схемы базы данных, соответствующей моделируемым сущностям. Для решения этой задачи платформа предлагает подход на основе скриптов создания и обновления БД. Далее рассматриваются практические шаги по применению этого подхода.

Задача по созданию и поддержке схемы БД состоит из двух частей: создание скриптов и их выполнение.

Скрипты могут быть созданы как вручную, так и с помощью Studio. Рассмотрим процесс создания скриптов в Studio. Для этого выполните команду Generate DB scripts, расположенную в секции Entities. При этом Studio подключается к базе данных, определенной на странице Project properties, и сравнивает имеющуюся схему БД с текущей моделью данных.

Если база данных отсутствует, либо в ней нет таблиц SYS_DB_CHANGELOG и SEC_USER, то генерируются только скрипты инициализации БД. В противном случае создаются также и скрипты обновления. Затем открывается страница, содержащая сгенерированные скрипты.

На вкладке Update scripts отображаются скрипты обновления. Скрипты со статусом new отражают разницу между текущим состоянием модели данных и схемы БД. Для каждой создаваемой или изменяемой таблицы создается отдельный скрипт. В отдельные скрипты помещаются также наборы ограничений целостности таблиц (referential integrity constraints). При закрытии страницы нажатием OK скрипты сохраняются в каталог db/update/{db_type} модуля core.

Со статусом applied отображаются скрипты, уже имеющиеся в проекте и примененные в БД ранее. Они не могут быть отредактированы или удалены.

На вкладке Update scripts могут также отображаться скрипты со статусом to be deleted. Это файлы, имеющиеся в проекте, но не примененные в БД. При закрытии страницы нажатием OK эти файлы будут удалены. Это нормально, если эти скрипты были созданы вами при предыдущей генерации, но не были применены вызовом Update database. В этом случае они больше не нужны, так как текущая разница между схемой БД и моделью данных отражена в новых только что сгенерированных скриптах. Если же, например, эти скрипты получены вами из системы контроля версий от другого разработчика, то вам следует отменить сохранение и сначала применить чужие скрипты на своей БД, а уже потом генерировать новые.

Вкладки Init tables, Init constraints, Init data отображают скрипты создания БД, располагающиеся в каталоге db/init/{db_type} модуля core.

На вкладке Init tables отображается скрипт создания таблиц 10.create-db.sql. Код, относящийся к одной таблице, отделяется комментариями begin {table_name} ... end {table_name}. При изменении некоторой сущности в модели Studio заменит код только между комментариями для соответствующей таблицы, не трогая остальной код, в который могли быть внесены ручные изменения. Поэтому при ручном редактировании не удаляйте эти комментарии, иначе Studio не сможет правильно встраивать свои изменения в существующие файлы.

На вкладке Init constraints отображается скрипт создания ограничений целостности 20.create-db.sql. В нем также присутствуют разделяющие таблицы комментарии, которые нельзя удалять.

На вкладке Init data отображается скрипт 30.create-db.sql, предназначенный для внесения дополнительной информации при инициализации БД. Это могут быть, например, функции, триггеры, или DML операторы для наполнения базы необходимыми данными. Содержимое данного скрипта создается вручную при необходимости.

На начальной стадии разработки приложения, когда модель данных активно меняется, рекомендуется пользоваться только скриптами создания БД (расположенными на вкладках Init tables, Init constraints, Init data), а скрипты обновления на вкладке Update scripts удалять сразу после вызова команды Generate DB scripts. Это наиболее простой и надежный способ поддержания БД в актуальном состоянии. Разумеется, он имеет один существенный недостаток - при применении скриптов БД пересоздается с нуля, поэтому все внесенные в нее данные теряются. Этот недостаток можно частично компенсировать на этапе разработки, добавив в скрипт Init data команды для создания первичных данных при инициализации.

Скрипты обновления становятся удобным и необходимым инструментом разработки и сопровождения БД на более позднем этапе, когда модель данных относительно стабильна, а в базах данных у разработчиков и в эксплуатации накоплены данные, которые нельзя терять при пересоздании БД с нуля.

Для применения скриптов используйте механизм выполнения скриптов БД задачами Gradle: чтобы пересоздать базу данных полностью, вызовите в главном меню пункт Run -> Create database, а чтобы применить скрипты обновления - пункт Run -> Update database. Следует иметь в виду, что эти пункты доступны, только если сервер приложения остановлен. Разумеется, соответствующие задачи Gradle (createDb и updateDb) можно вызвать в любой момент из командной строки, но если при этом база данных или какие-либо ее объекты заняты, выполнение скриптов завершится с ошибкой.