Protocol buffer/JSON 架构到 SQL DDL

mav*_*ckz 6 python jsonschema protocol-buffers snowflake-schema snowflake-cloud-data-platform

我们使用protocol buffers(protobuf) 在内部定义我们的模式,并让翻译器转换为各种其他内部表示形式,例如 JSON Schema(Protobuf 到 JSON 模式转换器),以便让 protobuf 模式成为事实来源。

我们还计划从 protobuf 模式创建 SQL DDL,但找不到可靠且支持良好的转换器。我们发现的一些工具(例如jsonutils)似乎并不活跃。

SQL 到 protobuf 生成器很多(示例: https: //github.com/jackskj/protoc-gen-map/)

我们需要一个简单的转换器来将 protobuf 模式转换为CREATE有关 protobuf 模式创建的语句,以及ALTER在 SnowSQL 中将新列添加到 protobuf 模式时的潜在语句(我们不支持更改字段类型或删除 protobuf 模式中的字段)。嵌套消息可以存储为variant且不必展平。是否有任何工具,或者我们应该为此编写一个自定义工具?

message Foo {
  string uuid = 1;
  MessageType1 message_type1 = 2;
  MessageType2 message_type2 = 3;
  google.protobuf.Timestamp updated_at = 4;
  float some_num = 5;
}
Run Code Online (Sandbox Code Playgroud)

被翻译成

CREATE TABLE FOO (
    uuid string,
    message_type1 variant,
    message_type2 variant,
    updated_at TIMESTAMP_LTZ(9),
    some_num float
);
Run Code Online (Sandbox Code Playgroud)

更新到架构

message Foo {
  string uuid = 1;
  MessageType1 message_type1 = 2;
  MessageType2 message_type2 = 3;
  google.protobuf.Timestamp updated_at = 4;
  float some_num = 5;
  string new_field = 6;
}
Run Code Online (Sandbox Code Playgroud)

将翻译为

ALTER TABLE FOO ADD COLUMN new_field string;
Run Code Online (Sandbox Code Playgroud)

或者

CREATE TABLE FOO (
    uuid string,
    message_type1 variant,
    message_type2 variant,
    updated_at TIMESTAMP_LTZ(9),
    some_num float,
    new_field string
);
Run Code Online (Sandbox Code Playgroud)