如何在Liquibase中排除DDL执行?
如何在Liquibase中排除DDL执行?
嘿,我完全理解你在Maven+Java环境里尝试跳过Liquibase的DDL执行却碰壁的烦恼!下面给你几个实用的方案,你可以根据自己的场景来试:
方案一:用上下文(Contexts)标记并过滤
这是最常用的方式,核心思路是给要排除的DDL变更集打上特定标记,执行时跳过这些标记的内容:- 给目标DDL变更集添加
context="ddl"标签,比如:
<changeSet id="create-example-table" author="your-name" context="ddl"> <createTable tableName="example_table"> <column name="id" type="INT" autoIncrement="true"/> <column name="name" type="VARCHAR(50)"/> </createTable> </changeSet>- 执行Liquibase命令时,通过参数指定不包含这个上下文:
如果是用Maven命令行,直接加-Dliquibase.contexts=!ddl,比如:
要是想在pom.xml里固定配置,就在Liquibase插件的configuration里加上:mvn liquibase:update -Dliquibase.contexts=!ddl<configuration> <contexts>!ddl</contexts> <!-- 其他配置 --> </configuration>
- 给目标DDL变更集添加
方案二:用前置条件(PreConditions)加开关参数
如果你需要更灵活的开关控制,可以给DDL变更集加前置条件,通过外部参数决定是否执行:- 在变更集里添加前置条件,检查
skip.ddl参数是否为true,如果是就标记为已执行(不实际运行):
<changeSet id="add-user-column" author="your-name"> <preConditions onFail="MARK_RAN"> <not> <propertyEquals property="skip.ddl" value="true"/> </not> </preConditions> <addColumn tableName="example_table"> <column name="user_id" type="INT"/> </addColumn> </changeSet>- 执行时传入参数开启跳过:
mvn liquibase:update -Dliquibase.skip.ddl=true- 在变更集里添加前置条件,检查
方案三:Spring Boot集成场景的快捷配置
如果你是在Spring Boot项目里用Liquibase,可以直接在application.properties或application.yml里配置上下文过滤:spring.liquibase.contexts=!ddl这样项目启动时,Liquibase就会自动跳过标记了
ddl上下文的变更集。
另外,你之前在实验室环境没成功,大概率是参数没传对或者标记没加正确——比如要注意上下文参数里的感叹号!不能少,它表示“排除”;还有要确保所有需要跳过的DDL变更集都正确加了对应的标记哦。
备注:内容来源于stack exchange,提问作者Maikol Cucunuba
相关产品推荐
相关产品推荐

