2

我的一个变更集有一个不正确的逻辑文件路径(两个变更集意外具有相同的逻辑文件路径),并且在现有变更集中编辑逻辑文件路径时,liquibase 更新失败并出现重复列错误,这意味着 liquibase 认为变更集不是执行并重新运行它。

liquibase 是否根据“已执行”标志或“id”、“作者”和“逻辑文件路径”的组合来识别变更集是否已被执行?

另外,在现有变更集的逻辑文件路径不正确的情况下,我该如何纠正错误

4

1 回答 1

9

它是如何工作的

来自 Liquibase 文档:

logicalFilePath- 用于在创建变更集的唯一标识符时覆盖文件名和路径。移动或重命名更改日志时需要。

Liquibase 根据以下内容计算 changeSet 的 MD5 校验和:

  • 变更集的内容;
  • 变更集的 ID;
  • 变更集的作者;
  • changeLog 文件的路径和名称或logicalFilePath

如果不更改changeSet 中的任何内容而只是尝试重新运行它,Liquibase 将查看databasechangelog.id、和databasechangelog.author,如果一切都与原来相同,则将跳过 changeSet。databasechangelog.FILENAMEdatabasechangelog.MD5SUM

如果更改 changeSet 的内容,liquibase 将抛出校验和已更改的错误(而databasechangelog.id,databasechangelog.authordatabasechangelog.FILENAME保持不变)。

如果更改了 id、作者或路径 (logicalFilePath),那么 Liquibase 会认为这是一个新的 changeSet 并会尝试执行它。

为什么你有问题

Liquibase 将您的 changeSet 视为新的,并且您有错误:

更新失败,出现重复列错误

我想您的变更集中没有任何内容preConditions,或者它们还不够,

你如何解决它:

所以既然 liquibase 认为你正在执行一个新的 changeSet,没有什么能阻止你写这些:

<preConditions onFail="MARK_RAN">
    <not>
        <columnExists tableName="your_table" columnName="your_column"/>
    </not>
</preConditions>

并且因为your_table.your_column已经存在于数据库中,那么这个changeSet将被标记为databasechangelog.EXECTYPE=MARK_RAN并被跳过。

问题解决了!

于 2020-02-10T08:53:54.043 回答