当前位置: 首页 > 知识库问答 >
问题:

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

翟俊远
2023-03-14

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

在我的应用程序中,我有以下spring配置文件-

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

下面是当前的数据库更改日志文件(如果我的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个答案

百里承业
2023-03-14

您需要在 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>
 类似资料:
  • 我们使用liquibase对数据库进行源代码控制。最初,我们从Postgres开始,创建了数据类型为特定于Postgres的列的变更集。 例如,我们有一个变更集,它创建了具有“JSON”类型字段的表。现在,我们想转移到其他数据库。因此,当我们针对另一个数据库运行变更集时,它无法创建表。我尝试添加“failOnError=false”。但是,后面的变更集失败,因为该表不存在。 您能建议如何重构旧的变

  • 我想在changelog文件中使用以下变更集标记数据库,以便将来回滚。当我应用这个变更集时,我在databasechangelog中注意到,前面的变更集也用标记更新了。 changelog文件中的变更集 下面是从databasechangelog表中提取的内容,function51是上一次运行的变更集 有人遇到过吗?我使用的是Liquibase 3.1.1 多谢了。

  • 使用Liquibase管理数据库模式更改的Spring Boot Java应用程序以指定其运行环境的参数(例如dev,int)启动。 有相应的属性文件(例如dev.properties、int.properties)为相应的环境定义属性。 因此,在dev.properties中,有例如。 在 tst.properties 中有 应用程序从对应于传入参数的文件中读入属性。 当应用程序在每个环境中部署

  • 我在酗酒方面遇到了麻烦。出于某种原因(我没有更改任何现有的变更集或其他东西),它试图应用已经在base中的变更集。所以我得到了一些错误,比如“关系”表“已经存在”。 我找到了这个标签-

  • 我已经用Spring试用过LiquiBase3.0测试版了(顺便说一句,它不适合2.0)。很顺利。 现在,我正在用Ant和相同的数据库和changelog测试它,在回滚所有更改并删除表DATABASECHANGELOG和DatabaseChangeloglock之后。 问题是liquibase将所有更改集记录在表DATABASECHANGELOG中,这意味着我的配置中没有任何错误,但它没有将更改提