如何在 Spring Boot 中为 dev 和 prod 环境划分 Liquibase 包结构?
How to divide Liquibase package structure for dev and prod environment in Spring Boot?
我的包结构如下:
在 /db.changelog/db.changelod-master.xml 我包括 /db.changelog/v1/db.changelog- 1.0.xml 其中我还包括来自 /db.changelog/v1/changeset 包的所有变更日志。
在我的应用中,我有两个配置文件:dev和prod,我需要根据"Best Practises" 的 Liquibase。一些变更日志可以在 prod 和 dev 环境中。
此外,我可以在 changeset 标签中使用 context 属性并显式设置 dev 或prod 值,但此解决方法不可取。
简单用法如下:我切换到 prod 配置文件,并且不会创建某些表或将跳过对数据库的某些插入。
你能帮我根据 Liquibase 的“最佳实践”重构包结构吗??
解决方案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:运行 -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>
解决方案2:
如果你不想使用 liquibase.context,你可以使用 maven 来过滤资源:
关键是将 Maven filter 元素与 resource 元素结合使用,如 Liquibase Documentation.
中所述
在 maven 命令中包含 resources 目标也很重要:
mvn resources:resources liquibase:update -Plocal
这是我使用的文件层次结构:
|-- pom.xml
`-- src
`-- main
|-- resources
| `-- liquibase.properties
| |-- changelog
| `-- db-changelog-master.xml
| `-- db-changelog-1.0.xml
|-- filters
|-- local
| `-- db.properties
|-- dev
| `-- db.properties
db.properties 文件如下所示:
database.driver = oracle.jdbc.driver.OracleDriver
database.url = jdbc:oracle:thin:@<host_name>:<port_number>/instance
database.username = user
database.password = password123
database.changelogfile = db.changelog-master.xml
liquibase.properties 文件如下所示:
changeLogFile: changelog/${database.changelogfile}
driver: ${database.driver}
url: ${database.url}
username: ${database.username}
password: ${database.password}
verbose: true
POM 文件如下所示:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<propertyFile>target/classes/liquibase.properties</propertyFile>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>src/main/filters/local/db.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
<profile>
<id>dev</id>
<build>
<filters>
<filter>src/main/filters/dev/db.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
</profiles>
至于我,我将 dev、prod 放入具有不同上下文的不同变更集中。
有留在同一个文件中。
<changeSet author="test" id="API-111" context="dev">
<sql>
insert into api_key(id, value) values (1, 'dev_value');
</sql>
</changeSet>
<changeSet author="test" id="API-111" context="uat">
<sql>
insert into api_key(id, value) values (1, 'uat_value');
</sql>
</changeSet>
<changeSet author="test" id="API-111" context="prod">
<sql>
insert into api_key(id, value) values (1, 'prod_value');
</sql>
</changeSet>
我的包结构如下:
在 /db.changelog/db.changelod-master.xml 我包括 /db.changelog/v1/db.changelog- 1.0.xml 其中我还包括来自 /db.changelog/v1/changeset 包的所有变更日志。
在我的应用中,我有两个配置文件:dev和prod,我需要根据"Best Practises" 的 Liquibase。一些变更日志可以在 prod 和 dev 环境中。
此外,我可以在 changeset 标签中使用 context 属性并显式设置 dev 或prod 值,但此解决方法不可取。
简单用法如下:我切换到 prod 配置文件,并且不会创建某些表或将跳过对数据库的某些插入。
你能帮我根据 Liquibase 的“最佳实践”重构包结构吗??
解决方案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:运行 -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>
解决方案2:
如果你不想使用 liquibase.context,你可以使用 maven 来过滤资源:
关键是将 Maven filter 元素与 resource 元素结合使用,如 Liquibase Documentation.
在 maven 命令中包含 resources 目标也很重要:
mvn resources:resources liquibase:update -Plocal
这是我使用的文件层次结构:
|-- pom.xml
`-- src
`-- main
|-- resources
| `-- liquibase.properties
| |-- changelog
| `-- db-changelog-master.xml
| `-- db-changelog-1.0.xml
|-- filters
|-- local
| `-- db.properties
|-- dev
| `-- db.properties
db.properties 文件如下所示:
database.driver = oracle.jdbc.driver.OracleDriver
database.url = jdbc:oracle:thin:@<host_name>:<port_number>/instance
database.username = user
database.password = password123
database.changelogfile = db.changelog-master.xml
liquibase.properties 文件如下所示:
changeLogFile: changelog/${database.changelogfile}
driver: ${database.driver}
url: ${database.url}
username: ${database.username}
password: ${database.password}
verbose: true
POM 文件如下所示:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<propertyFile>target/classes/liquibase.properties</propertyFile>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>src/main/filters/local/db.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
<profile>
<id>dev</id>
<build>
<filters>
<filter>src/main/filters/dev/db.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
</profiles>
至于我,我将 dev、prod 放入具有不同上下文的不同变更集中。
有留在同一个文件中。
<changeSet author="test" id="API-111" context="dev">
<sql>
insert into api_key(id, value) values (1, 'dev_value');
</sql>
</changeSet>
<changeSet author="test" id="API-111" context="uat">
<sql>
insert into api_key(id, value) values (1, 'uat_value');
</sql>
</changeSet>
<changeSet author="test" id="API-111" context="prod">
<sql>
insert into api_key(id, value) values (1, 'prod_value');
</sql>
</changeSet>