Взлетно — посадочная полоса — Различные миграции для определенных условий- Весенняя загрузка

#java #spring-boot #flyway

Вопрос:

Мы настраиваем/запускаем наши миграции flyway на java в нашем приложении Spring Boot.

Таким образом, у нас есть файлы миграции sql и java.

В определенных средах мы хотим, чтобы выполнялись дополнительные миграции. В основном в QA env мы хотим подготовить базу данных с данными для тестов.

Поэтому я знаю, что вы можете настроить несколько мест миграции на java.

Так что я могу сделать что-то вроде этого

 if(isQAenv == true)
{
Flyway.configure().locations("/db/migrations/","db/qaMigrations/")
else{
Flyway.configure().locations("/db/migrations/")
}
 

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

Нужно ли мне поддерживать систему нумерации в правильном порядке?

Итак, допустим, у меня есть следующие сценарии миграции, которые должны выполняться во всех средах

 db/migrations/V1__table1.sql
db/migrations/V2__table2.sql
db/migrations/V4__table2.sql
 

И эта миграция выполняется только в QA env

 db/qaMigrations/V3__insert_statements.sql
 

Теперь в не QA env у моего beacon_history_table есть миграция для 1,2,4. Есть ли какой-нибудь способ избежать этого и иметь что-то, что выглядит чище в таблице истории?

Ответ №1:

Вы можете легко сделать это с помощью профилей, поэтому предположим, что у вас есть профили, т. е. dev, prod, тогда вы можете легко определить spring.flyway.locations путь в файле свойств для этого профиля или в разделе для этого профиля в application.yml файле.

 spring:
  profiles: prod
  flyway:
    locations: classpath:/db/migration,classpath:/prod/db/migration
---
spring:
  profiles: dev
  flyway:
    locations: classpath:/db/migration,classpath:/dev/db/migration
 

Или, если у вас есть properties файл, то у вас должен быть файл, т. е. application-dev.properties , а затем

 spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration
 

Все пути, упомянутые выше, должны присутствовать внутри resources папки.

Комментарии:

1. Как вы контролируете порядок, в котором будут выполняться сценарии? Например. те, которые находятся в dev/db папке, заполняющей таблицу X, должны быть запущены после сценария в /db папке, создающей таблицу X, и перед сценарием в разделе /db переименование таблицы в Y

2. Порядок будет зависеть от версии, которую вы указываете в своем скрипте, поэтому, если версия папки dev больше, чем обычные, она будет применяться позже, если она первая, то она будет применяться первой перед общим