了解Liquibase中logicalFilePath的行为

时间:2020-02-08 13:37:46

标签: database-migration liquibase liquibase-sql

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

liquibase是否基于“ EXECUTED”标志或“ id”,“ author”和“ logicalFilePath”的组合来识别变更集是否已执行?

此外,在现有变更集具有不正确的logicalFilePath的情况下,我该如何纠正错误

1 个答案:

答案 0 :(得分:5)

工作方式

从Liquibase文档中:

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

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

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

如果不更改changeSet中的任何内容,并尝试重新运行它,则Liquibase将查看databasechangelog.iddatabasechangelog.authordatabasechangelog.FILENAMEdatabasechangelog.MD5SUM,如果一切都一样,那么changeSet将被跳过。

如果更改了changeSet的内容,则liquibase将抛出一个错误,即校验和已更改(databasechangelog.iddatabasechangelog.author和{ {1}}保持不变)。

如果更改了ID,作者或路径(逻辑文件路径),那么Liquibase会认为这是一个新的changeSet并将尝试执行它。

您为什么遇到问题

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

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

我想您的changeSet中没有databasechangelog.FILENAME,或者它们不够用,

如何解决它:

因此,由于liquibase认为您正在执行新的changeSet,因此没有什么可以阻止您编写这些内容:

preConditions

并且由于<preConditions onFail="MARK_RAN"> <not> <columnExists tableName="your_table" columnName="your_column"/> </not> </preConditions> 已经存在于数据库中,因此此changeSet将被标记为your_table.your_column并被跳过。

问题解决了!

相关问题