【问题标题】:How to skip required changeset while executing liquibase.bat如何在执行 liquibase.bat 时跳过所需的变更集
【发布时间】:2019-07-23 23:31:30
【问题描述】:

让我们举个例子: 在给定的 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”的变更集的可行性

原因是,我有不同的数据库,不希望某些特定的变更集不被执行。

我们有什么命令可以完成这项工作吗?

请指教。

【问题讨论】:

  • 如果需要忽略更改日志中的 chageset id-“3”,为什么需要它?还是需要根据任何条件跳过?
  • 是的 JITHIN。我需要有条件地跳过变更集。我在 liquibase 中发现了一些名为“上下文”的概念。现在我正在尝试调查这是否最适合我的要求。
  • 在这种情况下,您可以在变更集中使用前置条件。参考stackoverflow.com/a/57096840/4229716
  • 但在我的情况下,先决条件不适合,因为我没有任何条件而不是数据库信息。所以 Context 似乎最适合我。感谢您花时间向我建议不同的可能性

标签: liquibase


【解决方案1】:

执行此操作的标准方法是使用 liquibase 上下文和标签。 https://www.liquibase.org/2014/11/contexts-vs-labels.html

有一篇很好的博客文章描述了它们的使用

我在这里复制了大部分内容,以便于参考并防止链接失效。

上下文

Liquibase 中的上下文已经有很长一段时间了,它们最初主要是作为一种“标记”变更集的方式,以便可以在运行时选择它们。一种常见用途是将插入测试数据的 changeSet 标记为 context=”test”,以便在您的开发和 QA 环境中,您可以使用 –contexts=test 运行 liquibase 以获取测试数据,并在生产环境中使用 –contexts=prod 运行没有测试数据。上下文也有助于标记基于特征集的变更集以包括(context=”shoppingCart”)或捆绑(context=”pro”)甚至客户(context=”acme_inc”)。对于复杂的情况,可以将多个上下文应用于 changeSet,例如 context=”acme_inc, pro”,并且可以在运行时选择多个上下文,例如 –contexts=free,qa。

在 Liquibase 3.2 中,增加了对 changeSets 中上下文表达式的支持。现在,当你定义你的 changeSet 时,你可以指定复杂的逻辑,例如 context=”!test” 或 context=”qa or (acme_inc and dev)”。但是,上下文逻辑只能在您的 changeSet 定义中指定。运行 Liquibase 时,您仍然可以指定多个上下文,但您只是列出了适用于当前 Liquibase 运行的所有上下文。

标签

在 Liquibase 3.3 中添加了标签,以像上下文一样工作,但“倒退”了谁可以指定逻辑表达式。在您的变更集中,您只能指定适用于变更集的“标签”的简单列表,但在运行时您可以编写一个复杂的表达式来选择您想要执行的标签。这允许您指定一个带有标签=”qa, acme_inc” 的变更集,然后在运行时使用诸如 –labels=”!acme_inc” 或 –labels=”pro or (free and beta)”之类的表达式。

哪款适合您?

您是否应该使用上下文或标签取决于变更集编写器或 Liquibase 执行器是否最了解和/或需要最多控制要执行的变更集。

如果 changeSet 作者需要能够根据 Liquibase 将运行的环境类型指定复杂的逻辑,请使用上下文。 如果执行 Liquibase 的人需要指定复杂的逻辑来选择要运行的 changeSet,请使用标签。 如果不使用复杂的表达式,它们之间没有功能上的区别。

记住:你可以同时使用。

【讨论】:

  • 非常感谢史蒂夫对此的快速建议。我会仔细阅读您的建议,并在有更多问题时回复您:)
  • 在我的场景中,我只需要对一个变更集做出决定,默认情况下应该考虑其余部分,因为我有数百个变更集并且现在无法实现上下文概念..对此查询有什么建议吗?跨度>
  • 你好史蒂夫,根据你的建议,我已经进一步调查,似乎我从dba-presents.com/index.php/liquibase/… 得到了一些线索。如果对此有任何疑问,我会尝试并回复您
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多