两个使用 liquibase 的项目,如何处理变更日志中的冲突?

Two projects using liquibase, how to handle conflicts in changelogs?

我们有两个项目。项目 A 是一个提供基本功能的基础项目,我们将在内部发布,供其他人构建,项目 B 是我们的特定项目,它使用 A 的基本功能。

项目A和B都使用同一个数据库,并且有自己的liquibase变更集。

我想修改项目 A 的一个基础 classes,称之为实体。我们有一个 entityId(与数据库主键不同)字段,后来意识到不需要它,因为其他字段用于唯一标识 class。我们想从实体 class 和支持它的数据库中删除 entityId。我更新了项目 A 的 liquibase 文件以删除 entityId 列。

然而,在不久前的某个时候,在项目 B 中,有人决定要重命名他们创建的一些实体。他们写入项目 B 的 liquibase 变更集,将 entityId x 的实体从 "foo" 重命名为 "bar"。这是多次修订之前的旧更改的一部分。

问题是项目 A 的 liquibase 变更集 运行s 在项目 B 之前。因此,A 在 B 可以 运行 之前从实体 table 中删除了 entityId,并根据它的 entityId 将特定实体 "foo" 重命名为 "bar",我得到一个异常,说 entityId 没有当我们尝试 运行 B 的变更集时不存在。

我很乐意更改旧的变更集以根据名称进行重命名,即将名称为 "foo" 的任何实体重命名为 "bar"。但是,我不能回去修改旧的更改日志,因为数据库中显然保存了一个校验和,如果我们更改文件,我们将得到一个校验和异常,基本上是抱怨旧文件被更改了。

所以我的问题是,应该如何处理这个问题?我可以在不破坏项目 B 的 liquibase 的情况下从项目 A 中删除 entityId 吗?

另外,这种做法对吗?让一个项目为一个实体创建 table 而另一个项目填充它是否做错了什么?两个不同的项目可以为同一个数据库有不同的 liquibase 变更集,还是这总是会导致问题?

我不太确定你在这里使用 "project" 是什么意思,但我假设它的意思类似于我所说的 "team".

不管怎样,看起来你上一个问题的答案是肯定的,你做错了什么。我猜 "something" 是因为您的两个项目没有共享相同的代码库。

如果他们共享代码库,那么应用第二个更改的人就会知道第一个更改的存在,如果只是因为他们在从版本控制存储库更新了他们的代码。

所以对于未来,答案是您的项目需要共享公共代码,包括 Liquibase 变更集。

正在恢复

但这并不能帮助你从现在的状态中恢复过来。您承认更改已 运行 的变更集是不明智的,这是正确的。不过,有办法解决这个问题;例如,您可以从 DATABASECHANGELOG.

中删除关联的行

不过,这可能也不明智。这一切都取决于细节。

事实上,最简单的解决方案可能是确保项目 A 的变更集 运行在项目 B 的 之后。这样就会发生重命名,然后该列将被删除。

虽然您还必须考虑也许您的 entityId 专栏确实 毕竟需要的,因为项目 B 似乎正在使用它。

或者

如果由于某种原因您不能这样做,那么您应该能够通过明智地使用 <preConditions> 元素来解决这种情况。这将允许您根据模式的状态执行或不执行特定的变更集。