了解 liquibase 中 logicalFilePath 的行为

Ele*_*ast 2 database-migration liquibase liquibase-sql

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

liquibase 是否根据“EXECUTED”标志或“id”、“author”和“logicalFilePath”的组合来识别变更集是否已被执行?

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

hts*_*ame 6

它是如何工作的

来自 Liquibase 文档:

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

Liquibase 根据以下条件计算 changeSet 的 MD5 校验和:

  • 变更集的内容;
  • 变更集的 id;
  • 变更集的作者;
  • 更改日志文件的路径和名称或logicalFilePath

如果不改变任何东西在您的变更,只是尝试重新运行它,Liquibase会看databasechangelog.iddatabasechangelog.authordatabasechangelog.FILENAMEdatabasechangelog.MD5SUM,如果一切是因为它是相同的,那么该变更将被跳过。

如果改变内容的变更的,liquibase将抛出一个校验和是变化的情况(同时databasechangelog.iddatabasechangelog.authordatabasechangelog.FILENAME保持不变)。

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

为什么你有问题

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

更新失败,重复列错误

我想你preConditions的 changeSet 中没有任何东西,或者它们还不够,

你如何解决它:

因此,由于 liquibase 认为您正在执行一个新的变更集,因此没有什么可以阻止您编写这些:

<preConditions onFail="MARK_RAN">
    <not>
        <columnExists tableName="your_table" columnName="your_column"/>
    </not>
</preConditions>
Run Code Online (Sandbox Code Playgroud)

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

问题解决了!