Как использовать Flyway с Grails

Я знаю, что есть плагин Flyway2. Однако я не удовлетворен, так как он подходит для работы с консольными командами. Я хочу интегрировать Flyway программным способом, поэтому:

Первые интеграционные тесты используют flyway для обработки схемы БД с базой данных H2.

2nd Flyway запускается при развертывании tomcat и также обрабатывает базу данных среды (возможно, запустив ее из начальной загрузки?)

Кто-нибудь сталкивался с этим?

РЕДАКТИРОВАТЬ после некоторого обсуждения:

Чтобы использовать плагин, мне нужно получить полностью настроенный экземпляр GFlyway из контекста Spring. Это становится трудным, поскольку единственным свойством bean-компонента является def config, откуда он будет считывать все необходимые свойства. Вопрос в том, как воспроизвести это поведение в resources.groovy... как предоставить конфигурацию приложения в качестве параметра для bean-компонента.


person Rafael    schedule 04.02.2015    source источник
comment
У меня нет опыта использования этого плагина, но исходный код доступен на github github.com/Vav1lon/GFlyway2 и, конечно же, ничто не мешает вам реализовать именно то, что вы хотите, изучив, как работают сценарии командной строки, и интегрировав эти действия в свое приложение. Вы даже можете подумать о разветвлении плагина и добавлении этой функции/функций в плагин, чтобы другие могли использовать его.   -  person Joshua Moore    schedule 04.02.2015
comment
Я уже просмотрел код плагина... но обнаружил проблемы с его настройкой для работы программным способом. Мне нужно было бы поднять bean-компонент GFlyway в контексте весны, чтобы иметь возможность его использовать... однако я не уверен, как получить полностью настроенный экземпляр из контекста весны (с теми же инструментами настройки, которые используются для работы с командной строкой). .. достиг этого момента, я не уверен, стоит ли продолжать использовать плагин или напрямую интегрировать flyway. Вот почему я прошу помощи здесь.   -  person Rafael    schedule 04.02.2015
comment
Я имею в виду ... я пытался определить GFlyway или @Autowired GFlyway и, наконец, GFlyway f = (GFlyway) grailsApplication.mainContext.getBean(gFlyway); но кажется, что bean недоступен в контексте ... я пробовал разные имена. Есть ли у вас какие-либо подсказки или предложения, где продолжить исследования? Спасибо.   -  person Rafael    schedule 04.02.2015
comment
Глядя на исходный код плагина, если вам нужен этот класс, вам нужно будет создать его в resources.groovy как bean-компонент. Что-то вроде: gFlyaway(gflyway2.GFlyway). Тем не менее, также похоже, что предстоит проделать работу по подключению конфигурации и т. Д.   -  person Joshua Moore    schedule 04.02.2015
comment
Точно. Легко настроить простой экземпляр в resources.groovy... но я сталкиваюсь с проблемами, пытаясь получить полностью настроенный экземпляр, готовый к работе. В основном конструктор получает конфигурацию... откуда он может считывать различные свойства... но я не знаю, как воспроизвести это в resources.groovy :(   -  person Rafael    schedule 04.02.2015


Ответы (1)


Как мы обсуждали в комментариях, правильный способ настроить это как bean-компонент:

// Resources.groovy
beans {
  grailsApplication = ref('grailsApplication')
  gFlyaway(gflyway2.GFlyway) {
    config = grailsApplication.config
  }
}

Настройте параметры как обычно в своем Config.groovy в соответствии с документацией подключаемого модуля.

Это должно сблизить вас, если не полностью.

person Joshua Moore    schedule 04.02.2015
comment
Я получаю странное org.flywaydb.core.api.FlywayException: Невозможно инициализировать таблицу метаданных myAppName.schema_version с версией 0, так как эта версия использовалась для создания схемы... но действительно кажется, что теперь у меня настроен экземпляр GFlyway! ...большой шаг вперед. Спасибо. - person Rafael; 04.02.2015
comment
Глядя на AbstractFlyway.groovy, похоже, что плагин принимает только небольшое подмножество опций Flyway. Такие параметры, как baselineVersion или baselineOnMigrate, которые очень полезны при работе с уже существующими схемами, не поддерживаются, насколько мне известно. Это может быть причиной ошибки, которую я получаю. - person Rafael; 04.02.2015
comment
Мне удалось избежать этой проблемы, избегая вызова init. Вместо этого я установил grails.plugins.gflyway.initOnMigrate = true; и вызвал миграцию напрямую. Кажется, это работает, и теперь я успешно завершаю миграцию (!). Однако у меня есть новая проблема, так как я получаю таблицу XXX, которая не найдена ... может быть, это просто проблема выбора схемы - person Rafael; 04.02.2015