Protobuf转SnowSQL DDL可靠转换工具查询及转换规则说明
问题描述
我们内部使用protocol buffers(protobuf)定义schema,同时配备转换工具可将其转换为JSON Schema等多种内部表示形式,以此保证protobuf schema作为唯一真值源。
我们目前计划基于protobuf schema生成SQL DDL,但暂未找到可靠、维护活跃的转换工具,已检索到的同类工具大多已经停止维护。目前市面上SQL转protobuf的生成工具较多,但反向的protobuf转SQL DDL工具可选范围非常小。
我们需要一款轻量转换工具,满足以下要求:
- protobuf schema首次创建时,生成对应的SnowSQL
CREATE语句 - protobuf schema新增字段时,生成对应的
ALTER语句(我们内部规范已经限制protobuf schema不允许修改字段类型、删除字段) - 嵌套message无需平铺展开,直接存储为
variant类型
想咨询是否有符合要求的现成工具,还是需要自行开发自定义工具?
转换规则示例
原始protobuf定义:
message Foo { string uuid = 1; MessageType1 message_type1 = 2; MessageType2 message_type2 = 3; google.protobuf.Timestamp updated_at = 4; float some_num = 5; }
对应输出的建表语句:
CREATE TABLE FOO ( uuid string, message_type1 variant, message_type2 variant, updated_at TIMESTAMP_LTZ(9), some_num float );
新增字段后的protobuf定义:
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; }
可输出增量变更语句:
ALTER TABLE FOO ADD COLUMN new_field string;
也可输出全量建表语句:
CREATE TABLE FOO ( uuid string, message_type1 variant, message_type2 variant, updated_at TIMESTAMP_LTZ(9), some_num float, new_field string );
答复
目前没有完全匹配你需求的、仍在活跃维护的现成工具,更建议你团队自行开发自定义工具,开发成本非常低:
- 你的需求规则非常明确,没有复杂的兼容逻辑:只需要提前定义好protobuf基础类型到SnowSQL类型的映射关系,非基础类型的嵌套message统一映射为
variant,google.protobuf.Timestamp固定映射为TIMESTAMP_LTZ(9)即可完成建表逻辑。 - 你团队已经有protoc插件的使用经验,自定义protoc插件的开发门槛很低,大部分主流开发语言都有成熟的protoc插件开发库,只需要解析protobuf的descriptor信息就能生成对应的SQL语句。
- 增量
ALTER逻辑实现成本极低:你们本身已经限制了protobuf不能修改字段类型、删除字段,只需要存储上一版protobuf的字段元数据(字段名、对应SQL类型),和新版字段做对比,新增的字段直接生成ADD COLUMN语句即可。
内容的提问来源于stack exchange,提问作者maverickz
相关产品推荐
相关产品推荐

