保持 protobuf 规范与关系数据库(例如 PostgreSQL)同步的最佳实践

Ale*_*lex 10 postgresql schema-migration

1.我们有一个 Google 的 Protocol Buffers 格式的模式定义,我们用它来为不同的 gRPC 实现(Python、PHP)生成代码

2.我们有一个数据库 (PostreSQL),它从映射 Protocol Buffers 结构的 SQL 文件初始化。

问题: protobuf 规范经常发生变化。这必须反映在数据库中,这是一项繁琐的任务,手动完成时容易出错。

我们最近转移到 Alembic 迁移,以便在我们更新协议缓冲区规范时将持续更新迁移到(实时)数据库结构。但是,我们仍然觉得我们需要维护两个基本相同或至少非常相似的结构:ProtoBuf 和 SQL-Code(通过 Alembic Migrations 或在纯 *.sql 文件中管理)。

我一遍又一遍地搜索,关于其他人如何解决这个问题的信息很少。理想情况下,我们希望建立一个 CI/CD 流程,将 protobuf 规范(例如,消息名称从 更改teaspoonknife)转换为 SQL 模式定义(例如CREATE TABLE teaspoon (...);)或从中创建 SQL 迁移代码(例如ALTER TABLE teaspoon RENAME TO knife;)。

我知道它实际上比我的简单示例更复杂,但我什至找不到支持半自动和人工监督转换的代码。有什么建议吗?

到目前为止我发现了什么:

  • 从 SQL 文件,我们可以创建一个 PostgreSQL 数据库(例如在 Docker 中)并使用sqlacodegen自动创建一个 SQLAlchemy 模型
  • 从 SQLAlchemy 模型,我们可以使用 Alembic 迁移来创建(半)自动模式迁移代码
  • 我们回到零点:我们需要维护基本的 SQL 文件和 protobuf 规范
  • 墨卡托,但据我所知它只能从 SQL 映射到 gRPC,反之亦然
  • 还有migra,它看起来非常适合为不同的 PostgreSQL 模式生成自动差异(这是一个演示文稿文档

也许可能有“Protobuf 迁移”之类的东西,可以在其中为每个 protobuf 规范更改定义 SQL 迁移?

小智 1

这个问题可能还有另一种方法。Ruby on Rails (RoR) 人员通过创建迁移并定义差异来解决这个问题,以确保 SQL 模式可以正确迁移而不会导致数据损坏问题。我怀疑数据库模式比相应的原型缓冲区有更多的约束。

也许扩展 RoR 迁移机制来生成适当的原型缓冲区将是一个更干净的自动化过程。