gpt4 book ai didi

database - 使用 git/gerrit 迭代数据库迁移

转载 作者:搜寻专家 更新时间:2023-10-30 21:47:16 28 4
gpt4 key购买 nike

问题:如何使用慢速提交/gerrit 处理顺序数据库迁移脚本。

设置如下:

  • 数据库表的持续开发是通过添加具有连续名称(12.sql、13.sql、14.sql 等)的文件来完成的
  • 在数据库中设置版本号
  • 迁移工具根据文件检查版本,查看是否有未处理的数据库迁移

这种方法(否则效果很好)的主要问题是,当两个开发人员同时添加迁移脚本时,最后提交的人将发生 merge 冲突。在 subversion(我们一直使用到现在)中,这是一个树冲突,提交者通过恢复该文件并使用新文件名添加它来处理,作为最后一个操作。由于我们在 trunk 上使用这些东西,他们通常会设法修复文件名作为最后的快速操作。

现在我们正在迁移到 git,冲突将改为显示为文件内部的差异,这使得分离两个提交的文件(可能是不同提交包的一部分,以及其他文件)变得更加棘手。此外,由于我们使用 gerrit 进行代码审查,因此在将文件推送到主 git 存储库和将文件获取到主 git 存储库之间会有延迟,因此时不时会出现这种情况:

  1. 您 push 迁移
  2. Gerrit 在代码审查后遇到冲突
  3. 您通过重命名文件解决冲突,并推送新的提交(必须重新审核)
  4. 有人在代码审查之前设法进行了新的迁移,因此 Gerrit 再次发生冲突
  5. 您通过重命名文件解决冲突,并推送新的提交(必须重新审核)
  6. 从 4 开始重复,直到幸运地 Gerrit 成功提交迁移。

解决这种情况的最佳方法是什么?

最佳答案

我使用 liquibase管理我的数据库迁移。

它使用 XML 语法来描述数据库的每个“变更集”。虽然这可能成为采用的障碍,但我发现将不同开发人员的贡献 merge 到同一个文件中要容易得多。

<changeSet id="bob-20130115-1" author="bob">
<createTable tableName="commontable">
..
..
</createTable>
</changeSet>

<changeSet id="tom-20130115-1" author="tom">
<addColumn tableName="commontable">
<column name="newcolumn" type="varchar(255)"/>
</addColumn>
</changeSet>

使用 liquibase 的第二个优点是它支持回滚。如果发生冲突,我们可以撤消变更集,将我们带回上一个稳定版本,修复迁移文件并执行全新更新。

如果您没有切换工具的奢侈,那么我建议您采用 liquibase 的方法,将 DEV 期间的每次迁移都视为“变更集”。对每个迭代使用一个迁移文件,并在每个开发人员贡献的开始和结束处添加注释。在 merge 冲突的情况下,不要试图重写 SQL,而是重新排序,以便一个开发人员的更改在其他开发人员之前或之后进行。 (强制其他开发人员创建另一个文件的方法是有效的,但我发现在实践中很难实现,当第三个开发人员稍后出现并与序列中的下一个数字冲突时......)

在没有回滚功能的情况下管理集成环境很棘手……除了每次都从头开始重建数据库之外,我不知道有什么简单的方法。也许唯一有效的方法是遵循 VonC 的建议并将数据库更改器的数量保持在最低限度。

注意事项:

  • 每个开发人员都使用自己的数据库。您使用的是迁移工具,所以应该没有异议。它简化了问题,尤其是当您需要取消并重建架构时。它还会迫使您应对“测试数据”挑战……当我处理测试数据位于单个数据库实例中的项目时,我会磨磨蹭蹭……
  • 我最近发现 SQL Alchemy migrate具有与 liquibase 相同的回滚功能。它强制您为每个迁移编写前滚和回滚脚本。

关于database - 使用 git/gerrit 迭代数据库迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339163/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com