Ele*_*ast 2 database-migration liquibase liquibase-sql
我的一个变更集有一个不正确的逻辑文件路径(两个变更集意外地具有相同的逻辑文件路径)并且在现有变更集中编辑逻辑文件路径时,liquibase 更新失败并出现重复列错误,这意味着 liquibase 认为变更集不是执行并重新运行它。
liquibase 是否根据“EXECUTED”标志或“id”、“author”和“logicalFilePath”的组合来识别变更集是否已被执行?
另外,在现有变更集的逻辑文件路径不正确的情况下,我如何纠正错误
它是如何工作的:
来自 Liquibase 文档:
logicalFilePath- 用于在创建更改集的唯一标识符时覆盖文件名和路径。移动或重命名更改日志时需要。
Liquibase 根据以下条件计算 changeSet 的 MD5 校验和:
logicalFilePath;如果你不改变任何东西在您的变更,只是尝试重新运行它,Liquibase会看databasechangelog.id,databasechangelog.author,databasechangelog.FILENAME和databasechangelog.MD5SUM,如果一切是因为它是相同的,那么该变更将被跳过。
如果你改变内容的变更的,liquibase将抛出一个校验和是变化的情况(同时databasechangelog.id,databasechangelog.author并databasechangelog.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并被跳过。
问题解决了!
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |