использование профилей загрузки spring с атрибутом контекста набора изменений liquibase для управления областью изменения

#postgresql #spring-boot #liquibase #liquibase-hibernate

#postgresql #spring-boot #liquibase #liquibase-спящий режим

Вопрос:

Я пытаюсь создать приложение для проверки концепции с помощью spring boot и liquibase. По сути, я хочу создать приложение загрузки spring, которое может управлять наборами изменений liquibase, используя атрибут набора изменений с именем context, чтобы наборы изменений без контекста можно было применять к любому профилю загрузки spring, тогда как наборы изменений с определенным контекстом (например, context =»dev» ) будут применяться только в том случае, если профили загрузки springэтот тип активен (например, spring.profiles.active=dev).

В моем приложении у меня есть следующие профили spring -> dev, prod (каждый правильно указан в файле yaml приложения с учетными данными relavant profile db, также указанными в профиле). Что мне нужно сделать, чтобы это сработало. ниже приведено мое приложение.yaml

 spring:
  application:
    name: liquibase-spring-jpa-postgres-example
liquibase:
  change-log: db.changelog/db.changelog-master.xml

spring:
  profiles: dev
  datasource:
    url: jdbc:postgresql://localhost:5432/dev
    username: postgres
    password: password
    driver-class-name: org.postgresql.Driver

spring:
  profiles: ci
  datasource:
      url: jdbc:postgresql://localhost:5432/ci
      username: postgres
      password: password
      driver-class-name: org.postgresql.Driver

spring:
  profiles: qa
  datasource:
      url: jdbc:postgresql://localhost:5432/qa
      username: postgres
      password: password
      driver-class-name: org.postgresql.Driver

spring:
  profiles: production
  datasource:
      url: jdbc:postgresql://localhost:5432/prod
      username: postgres
      password: password
      driver-class-name: org.postgresql.Driver
  

и ниже приведен текущий файл databaseChangeLog (второй набор изменений не должен запускаться, если мой профиль spring является prod).

 <changeSet id="20161016_my_first_change" author="fike" context="dev, qa, ci, production">
    <sql>
        CREATE TABLE customer
        (
        id BIGSERIAL PRIMARY KEY,
        firstname character varying NOT NULL,
        lastname character varying NOT NULL
        );
    </sql>
    <rollback>
        drop table customer;
    </rollback>
</changeSet>

<changeSet id="20161016_my_first_change2" author="krudland" context="dev">
    <sql>
        insert into customer (firstname, lastname) values ('Franklin','Ike');
    </sql>
    <rollback>
        delete from customer where firstname = 'Franklin' and lastname = 'Ike';
    </rollback>
</changeSet>
  

В принципе, мне нужно иметь возможность управлять своим контекстом liquibase, используя мой профиль spring. Возможно ли это?

Ответ №1:

Вам необходимо определить свойство ‘liquibase.contexts’ в вашем файле yaml. Что-то вроде приведенного ниже.

 spring:
  profiles: dev
  datasource:
    url: jdbc:postgresql://localhost:5432/dev
    username: postgres
    password: password
    driver-class-name: org.postgresql.Driver
liquibase:
   contexts: dev
  

После добавления этого приведенный ниже набор изменений будет выполняться только тогда, когда ваш локальный профиль является «dev» (т.е. spring-boot: run -Dspring.profiles.active= dev)

 <changeSet id="20161016_my_first_change2" author="krudland" context="dev">
    <sql>
        insert into customer (firstname, lastname) values ('Franklin','Ike');
    </sql>
    <rollback>
        delete from customer where firstname = 'Franklin' and lastname = 'Ike';
    </rollback>
</changeSet>
  

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

1. В Spring Boot 2.0 свойство liquibase устарело и перемещено в spring root: spring.liquibase.contexts

Ответ №2:

Лучший способ — ссылаться на профиль spring в настройках контекста liquibase, начиная с версии spring boot версии 2. единственное, что вам нужно добавить в main application.yml или application.properties is:

 spring.liquibase.contexts=${spring.profiles.active}
  

Ваш активный профиль spring будет использоваться в качестве активного контекста liquibase.