我的一个变更集具有一个不正确的逻辑文件路径(两个变更集意外地具有相同的逻辑文件路径),并且在现有变更集中编辑逻辑文件路径时,liquibase更新失败,并出现重复列错误,这意味着liquibase认为变更集不执行并重新运行。
liquibase是否基于“ EXECUTED”标志或“ id”,“ author”和“ logicalFilePath”的组合来识别变更集是否已执行?
此外,在现有变更集具有不正确的logicalFilePath的情况下,我该如何纠正错误
答案 0 :(得分:5)
工作方式:
从Liquibase文档中:
logicalFilePath
-用于在创建唯一文件时覆盖文件名和路径 变更集的标识符。移动或重命名更改时需要 日志。
Liquibase根据以下内容计算changeSet的MD5校验和:
logicalFilePath
的路径和名称; 如果您不更改changeSet中的任何内容,并尝试重新运行它,则Liquibase将查看databasechangelog.id
,databasechangelog.author
, databasechangelog.FILENAME
和databasechangelog.MD5SUM
,如果一切都一样,那么changeSet将被跳过。
如果您更改了changeSet的内容,则liquibase将抛出一个错误,即校验和已更改(databasechangelog.id
,databasechangelog.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
并被跳过。
问题解决了!