Использование groovy при обновлении БД

Добрый день.
Столкнулся со следующим, не очень понятным поведением при использовании groovy-скриптов при обновлении БД.

При использовании groovy для обновления базы/добавления данных скрипты отрабатывают корректно. Но, если есть проект, в котором использовался groovy и создается база с нуля, то обновление данных не происходит. При первом старте приложения отрабатывают sql-скрипты создания БД и в таблицу sys_db_changelog добавляются все и папки update, с признаком того, что все обновления были применены, при этом запуск groovy на этапе первоначального создания и инициализации БД не происходит.

Итого:

  • если происходит обновление БД, то все, вновь добавленные скрипты отрабатывают корректно.
  • если создается БД с нуля, то groovy не запускаются совсем.

Пример проекта в приложении.

Алексей.groovytest.zip (262.9 КБ)

Здравствуйте,

Если БД создается с нуля, то отрабатывают только init скрипты. Update скрипты при этом не выполняются. Есть вполне четкое разделение на процессы создания БД (init) и обновления (update). Эти процессы не пересекаются.
Если вы хотите заполнять данные при создание БД, то необходимо создать 30.create-db.sql и заполнять данные в этом скрипте.

Это все понятно, но при отработке init все скрипты в update (sql и groovy) помечаются как выполненные, при этом groovy с секцией postUpdate на этапе init, как я понимаю, не поддерживается.

Нет данное поведение не поддерживается.

Но вы можете сделать что то похожее при помощи AppContextStartedEvent, когда после запуска приложения можно выполнить какие либо действия (в том числе и инициализацию). Примеры можно увидеть в темах:


За ссылки на альтернативные варианты спасибо, буду изучать.

Можно ли сделать так, чтобы groovy-скрипты не отмечались как выполненные?

Хочу поддержать данный вопрос. Возможно ли это? Требуется это для того, чтобы выполнить первоначальную инициализацию данных с помощью jmx-бина PersistenceManager.update().

Я думаю, это возможно технически, но придется переопределять код платформы - создать наследника задачи CubaDbCreation в build.gradle и использовать его для createDb.

Учтите, что в некоторых аддонах CUBA - в Reports - есть свои groovy update скрипты. Если их не помечать как выполненные, то они будут пытаться выполниться и упадут с ошибкой или возможно попортят структуру БД.

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

Первоначальная инициализация данных выполняется элементарно через слушатель на AppContextStartedEvent. Если нужно запомнить состояние, что БД проинициализирована и второй раз то же делать не нужно, то заводится персистентный флажок в БД (можно для этого завести boolean свойство в конфигурационном интерфейсе).

Вот здесь есть пример импорта отчетов на старте приложения:

Его только нужно дополнить запоминанием состояния, чтобы он не выполнялся каждый раз.

2 симпатии

Соглашусь.

Александр, а может быть подумаете над этим вопросом? Условно говоря, чтобы не ломать существующую систему обновления, кладем груви в папку init, а выполнять их будем с помощью PersistenceManager.updateDatabase("init"). Можно и замыкание поменять в скрипте с postUpdate на postInit при необходимости.