让我们举个例子: 在给定的liquibase xml文件中,我具有多个具有不同ID的变更集。
changeSet id="1"
changeSet id="2"
changeSet id="3"
changeSet id="4"
liquibase.bat --changeLogFile=..\MasterChangelog.xml --driver==com.microsoft.sqlserver.jdbc.SQLServerDriver --classpath=sqljdbc4-3.0.jar --url="jdbc:sqlserver://;databaseName=MyDB;user=MyUser;password=MyPassword;" --logLevel=INFO update
以上所有变更集将按预期执行。
现在我的要求是,我应该可以忽略/不考虑ID为“ 3”的变更集
原因是,我有不同的数据库,并且不希望某些特定的变更集不被执行。
我们有任何命令可以完成此操作吗?
请告知。
答案 0 :(得分:0)
执行此操作的标准方法是使用liquibase上下文和标签。 https://www.liquibase.org/2014/11/contexts-vs-labels.html
上有一篇不错的博客文章,描述了它们的用法。为了方便参考和防止链接腐烂,我在这里复制了大部分内容。
上下文
Liquibase中的上下文已经存在了相当长的一段时间,它们最初主要是作为“标记” changeSet的一种方式,因此可以在运行时进行选择。一种常见用途是将插入测试数据的changeSet标记为context =” test”,以便在开发和QA环境中,可以使用–contexts = test运行liquibase以获取测试数据,而在生产环境中,可以使用–contexts = prod运行没有测试数据。上下文还有助于基于功能集将更改集标记为包括(context =“ shoppingCart”)或捆绑软件(context =“ pro”)甚至是客户(context =“ acme_inc”)。对于复杂的情况,可以将多个上下文应用于changeSet,例如context =” acme_inc,pro”,并且可以在运行时选择多个contex,例如–contexts = free,qa。
使用Liquibase 3.2,增加了对changeSets中上下文表达式的支持。现在,当您定义changeSet时,可以指定复杂的逻辑,例如context =”!test”或context =“ qa或(acme_inc和dev)”。但是,只能在您的changeSet定义中指定上下文逻辑。在运行Liquibase时,您仍然可以指定多个上下文,但是您只列出了适用于当前Liquibase运行的所有上下文。
标签
在Liquibase 3.3中添加了标签,使其像上下文一样工作,但在谁可以指定逻辑表达式的过程中却“落后”。在changeSet中,您只能指定一个简单的适用于changeSet的“标签”列表,但是在运行时,您可以编写一个复杂的表达式来选择要执行的标签。这样,您可以指定带有标签=“ qa,acme_inc”的changeSet,然后在运行时使用诸如–labels =“!acme_inc”或–labels =“ pro或(免费和beta)的表达式。
哪个适合您?
是否应该使用上下文或标签取决于changeSet编写器或Liquibase执行器是否最了解和/或最需要控制执行哪些changeSet。
如果changeSet作者需要能够根据将运行Liquibase的环境类型指定复杂的逻辑,请使用上下文。 如果执行Liquibase的人员需要指定复杂的逻辑来选择要运行的changeSet,请使用标签。 如果您不使用复杂的表达式,则它们之间在功能上没有区别。
请记住:您可以同时使用。