了解 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.id
、databasechangelog.author
、databasechangelog.FILENAME
和 databasechangelog.MD5SUM
,如果一切都和原来一样,则将跳过 changeSet。
如果您更改了 changeSet 的内容,liquibase 将抛出校验和已更改的错误(而 databasechangelog.id
, databasechangelog.author
和 databasechangelog.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
并被跳过。
问题已解决!
我的一个变更集有一个不正确的 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.id
、databasechangelog.author
、databasechangelog.FILENAME
和 databasechangelog.MD5SUM
,如果一切都和原来一样,则将跳过 changeSet。
如果您更改了 changeSet 的内容,liquibase 将抛出校验和已更改的错误(而 databasechangelog.id
, databasechangelog.author
和 databasechangelog.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
并被跳过。
问题已解决!