了解 liquibase 中 logicalFilePath 的行为

Understanding the behaviour of logicalFilePath in liquibase

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

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

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

它是如何工作的:

来自 Liquibase 文档:

logicalFilePath - Use to override the file name and path when creating the unique identifier of change sets. Required when moving or renaming change logs.

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

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

如果不在你的 changeSet 中改变任何东西,只是尝试重新运行它,Liquibase 会查看databasechangelog.iddatabasechangelog.authordatabasechangelog.FILENAMEdatabasechangelog.MD5SUM,如果一切都和原来一样,则将跳过 changeSet。

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

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

为什么有问题:

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

update failed with an error of duplicate column

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

如何解决:

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

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

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

问题已解决!