使用带有 liquibase 变更集上下文属性的 Spring Boot 配置文件来管理变更集范围

Posted

技术标签:

【中文标题】使用带有 liquibase 变更集上下文属性的 Spring Boot 配置文件来管理变更集范围【英文标题】:using spring boot profiles with liquibase changeset context attribute to manage changset scope 【发布时间】:2017-02-26 14:04:34 【问题描述】:

我正在尝试使用 spring boot 和 liquibase 进行概念验证应用程序。我基本上想创建一个可以通过使用名为 context 的变更集属性来管理 liquibase 变更集的 Spring Boot 应用程序,这样没有上下文的变更集可以应用于任何 Spring Boot 配置文件,而具有特定上下文的变更集(例如 context="dev" )仅当该类型的弹簧引导配置文件处于活动状态(例如 spring.profiles.active=dev)时才会应用。

在我的应用程序中,我有以下 spring 配置文件 -> dev、prod(每个都在应用程序 yaml 文件中正确指定,并在配置文件下指定了相关的配置文件 db 凭据)。我需要做什么才能完成这项工作。下面是我的application.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>

我基本上需要能够使用我的 spring 配置文件来管理我的 liquibase 上下文。这可能吗?

【问题讨论】:

【参考方案1】:

您需要在 yaml 文件中定义“liquibase.contexts”属性。如下所示。

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>

【讨论】:

在 Spring Boot 2.0 中,liquibase 属性已被弃用并移至 spring 根目录下:spring.liquibase.contexts

以上是关于使用带有 liquibase 变更集上下文属性的 Spring Boot 配置文件来管理变更集范围的主要内容,如果未能解决你的问题,请参考以下文章

如何回滚其他上下文的变更集?

Liquibase Java,变更集不适用

liquibase - 变更集的执行顺序

使用 liquibase 构建测试脚本以使用普通脚本按顺序执行

如何从数据库中删除最后执行的 liquibase 变更集

没有前置条件的 Liquibase 变更集