You need to enable JavaScript to run this app. Spring Boot如何借助Liquibase上下文在指定Profile下插入开发测试假数据
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot如何借助Liquibase上下文在指定Profile下插入开发测试假数据

问题根因

你碰到的现象是Liquibase 4.2.0版本的固有行为缺陷,核心原因有两点:

  • 该版本对<include>标签上配置的context属性,不支持级联传递过滤规则。也就是说你给include加的context="prod"配置,只会作用在include节点本身的校验逻辑上,不会给被引入文件内的所有changeSet套上“仅prod环境执行”的限制。
  • 你在local_data_for_dev.xml里定义的假数据changeSet本身没有配置任何context属性,按照Liquibase的默认规则,没有配置context的changeSet属于“全环境通用”的执行项,会被全局执行逻辑直接捞取执行,外层include的context过滤在这个场景下根本拦不住。

这也是为什么你把include的context从dev改成prod,dev环境启动时还是会插入假数据——根本不是dev环境的Liquibase上下文传错了,是你依赖的include级联context过滤在4.2.0版本里压根就没有按预期工作。

正确的隔离实现方案

要稳定实现“仅dev profile执行假数据插入”,不要依赖include标签的context配置,用Liquibase从早期版本就稳定支持的原生过滤逻辑即可,步骤如下:

  • 最稳定的实现方式:直接给需要隔离的changeSet本身加上context配置。打开local_data_for_dev.xml,在假数据对应的changeSet标签上增加context="dev"属性:
    <changeSet id="20200422091200-fakedata" author="me" context="dev">
      <!-- 原有loadData等配置保持不变 -->
    </changeSet>
    
    这种changeSet级别的context过滤是Liquibase的核心逻辑,不受版本、引入层级的影响,只要changeSet自身声明了context,运行时会严格匹配全局传入的上下文(也就是你配置的spring.liquibase.contexts=dev),只有上下文匹配时才会执行,不匹配就直接跳过。
  • 如果文件内有多个假数据changeSet,不用逐个给changeSet加context,可以直接在local_data_for_dev.xml的根节点<databaseChangeLog>上加上context="dev"配置。这个配置会自动作用在文件内所有没有自定义context的changeSet上,且在4.2.0版本是可以正常生效的,不会出现include标签的过滤bug。
  • 最后把主changelog里的include标签恢复成无context的普通引入即可,不需要在include上额外加context配置:
    <include file="changelog/1.0.0/financial_security/local_data_for_dev.xml" relativeToChangelogFile="true"/>
    
  • 验证时注意:清理数据库必须清空DATABASECHANGELOG系统表的所有记录,不然已经标记为执行过的changeSet会直接被跳过,很容易出现“明明改了配置没生效”的误判。

内容的提问来源于stack exchange,提问作者Natty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 11:54:04