我在尝试通过引用sibling-changeset来回滚一个changeSet时遇到了问题。
主changelog.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>
答案 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
目录中。