You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
);

答复

目前没有完全匹配你需求的、仍在活跃维护的现成工具,更建议你团队自行开发自定义工具,开发成本非常低:

  1. 你的需求规则非常明确,没有复杂的兼容逻辑:只需要提前定义好protobuf基础类型到SnowSQL类型的映射关系,非基础类型的嵌套message统一映射为variant,google.protobuf.Timestamp固定映射为TIMESTAMP_LTZ(9)即可完成建表逻辑。
  2. 你团队已经有protoc插件的使用经验,自定义protoc插件的开发门槛很低,大部分主流开发语言都有成熟的protoc插件开发库,只需要解析protobuf的descriptor信息就能生成对应的SQL语句。
  3. 增量ALTER逻辑实现成本极低:你们本身已经限制了protobuf不能修改字段类型、删除字段,只需要存储上一版protobuf的字段元数据(字段名、对应SQL类型),和新版字段做对比,新增的字段直接生成ADD COLUMN语句即可。

内容的提问来源于stack exchange,提问作者maverickz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:36:07