#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.