与AND的Liquibase上下文

时间:2018-10-04 15:44:15

标签: command-line migration database-migration liquibase

liquibase documentation中写道,可以在用AND,OR 、!指定的变更集中定义上下文。和括号。但是我没有找到将contexts=" V1.0 AND V2.0"参数传递给liquibase的方法(通过命令行),因为每次执行该操作时,liquibase都会生成一个空的SQL文件。这是我尝试的方法:

 .\liquibase --url=offline:mssql? `
--changeLogFile="C:\Users\Ferid\Documents\Box Sync\PRIVATE_Ferid\liquibase-3.5.5-bin\cl.xml" `
--outputFile="C:\Users\Ferid\Documents\Box Sync\PRIVATE_Ferid\liquibase-3.5.5-bin\output.sql" `
--contexts="V1.0 AND V2.0" `
updatesql

当我仅传递一个上下文或使用V1.0, V2.0以便他生成具有两个版本之一的所有变更集时,它运行良好,但是我只需要生成同时具有这两个上下文的变更集(V1.0 AND V2.0)。

这是一个示例,我的变更日志文件的上下文属性看起来像

<changeSet author="Ferid" id="1536838228609-1" context="V1.0"> ... </changeSet>
<changeSet author="Ferid" id="1536838228609-2" context="V2.0"> ...</changeSet>

<changeSet author="Ferid" id="1536838228609-3" context="V1.0 AND V2.0"> ...</changeSet>

我尝试了不同的语法,但是没有一个对我有用。我正在使用liquibase 3.5.5。

1 个答案:

答案 0 :(得分:1)

上下文最适合用于环境(例如DEV,STAGING,PRODUCTION)之类的事情。对于您正在做的事情,最好使用标签。

标签和上下文都可以用来控制将变更集应用于不同环境的位置和时间。它们经常相互结合使用。

此表中表示一个主要区别:

                   labels             contexts
in commands        expression         list
in changelog       list               expression

因此,在定义变更日志时,每个变更集都可以具有“标签”属性,该属性可以包含逗号分隔的标签列表。每个变更集可以具有“上下文”属性,该属性可以包含复杂的上下文表达。复杂的表达式就像“ qa或(acme_inc和dev)”

相反,在使用命令(即部署)时,您可以为标签指定复杂的表达式,但只能指定上下文列表。

下面链接的文章比较深入,但是通常,当您可以简单地枚举/描述changeSet的用途时,标签很有用,但是部署时间环境的描述很复杂。当应该在其中部署变更集的“上下文”是一个复杂的决策时,最好由变更集作者而不是部署者来决定。

Nathan在博客文章http://www.liquibase.org/2014/11/contexts-vs-labels.html

中了解了更多有关Liquibase如何处理这些问题的地方。