在回滚部分中引用兄弟变更集

时间:2015-07-13 12:34:36

标签: liquibase

我在尝试通过引用sibling-changeset来回滚一个changeSet时遇到了问题。

主changelog.xml

  • 包括v.1.changes.xml(这是创建的表)
  • 包括v.2.changes xml(此处删除了表格,我想将v.1.changes.xml中的变更集作为回滚引用)

但是,无论我如何引用v.1.changes.xml中的变更集,它都对v.2.changes.xml不可见,而且我得到liquibase.exception.SetupException:liquibase。 parser.core.ParsedNodeException:未找到更改集。

主changelog.xml

<include file="v1/v1.changes.xml" relativeToChangelogFile="true"/>
<include file="v2/v2.changes.xml" relativeToChangelogFile="true"/>

v1.changes.xml

  <changeSet id="1" author="dima">
    <createTable tableName="test-table">
      <column name="test" type="number"></column>
    </createTable>
  </changeSet>

v2.changes.xml

  <changeSet id="1" author="dima">
    <dropTable tableName="test"/>
    <rollback changeSetAuthor="dima" changeSetId="1" changeSetPath="src/main/resources/std/v1/v1.changes.xml"/>
  </changeSet>

1 个答案:

答案 0 :(得分:0)

您似乎正在使用Maven,因此我的答案将特定于Maven,因为我无法在命令行上重现该解决方案。

首先,由于您在两个文件中使用相同的changeSet ID,因此Liquibase可能会感到困惑,我不确定它是否正确地将这些ID范围限定为changeSet文件,或者如果id需要是全局的。您可能首先尝试更改第二个changeSet上的id,看看它是否为您清除它。

如果这不是问题,那么让它工作的诀窍是确保你的相对引用都在Java类路径的上下文中。在我解释您的示例时,文件的类路径资源将是:

std/master-changelog.xml
std/v1/v1.changes.xml
std/v2/v2.changes.xml

运行迁移时,changeLogFile设置应引用类路径资源,而不是磁盘文件;即std/master-changelog.xml而不是src/main/resources/std/master-changelog.xml。这将原始更改日志放在类路径上下文而不是文件上下文中。

v2.changes.xml中,您可以使用类路径资源名称引用第一个更改:v1/v1.changes.xml。这应该允许Liquibase正确找到它。

如果你有多个级别的changeLog文件包含,你可能会遇到this issue,这会阻止Liquibase在第一级包含之下找到兄弟变更日志。在拉取请求合并和发布之前,您将被限制为单个级别的文件包含。

此解决方案假设您正在使用Maven插件,liquibase仍会找到更改日志,因为默认情况下Maven会将您的资源文件放在类路径上。我还将插件附加到process-resources步骤(或更高版本),以便在运行迁移时源资源将位于target/classes目录中。