有没有办法使用Go结构生成Avro模式文件?

问题描述 投票:0回答:1

我目前正在开发一个项目,需要从 Go 结构生成 Avro 架构文件。我想知道是否有任何现有的解决方案或库可以帮助我实现这一目标。

理想情况下,我希望找到一种基于 Go 中定义的结构自动生成 Avro 模式的方法。这将大大简化单独定义和维护模式的过程。

如果有人对如何完成此任务有任何见解、建议或示例代码片段,我将非常感谢您的帮助!

示例: 例如,考虑以下 Go 结构:

type User struct {
    ID        int    `avro:"id" json:"id"`
    Name      string `avro:"name" json:"name"`
    Age       int    `avro:"age" json:"age"`
    Email     string `avro:"email" json:"email"`
    Timestamp int64  `avro:"timestamp" json:"timestamp"`
}

我想生成一个 Avro 架构文件,自动反映此 Go 结构的结构和字段类型。这将使我能够与其他系统共享架构。

任何有关如何实现这一目标的指导或建议将不胜感激。预先感谢您的帮助!

go schema avro avro-tools
1个回答
0
投票

我知道这个问题有点老了,但我自己也一直在努力解决这个问题,并且它已经被查看了数百次。

有两个项目您应该看看。首先,要回答您的问题,您可以使用 github.com/wirelessr/avroschema.

从结构生成 avro 架构。

例如:

import "github.com/wirelessr/avroschema"

type User struct {
    ID        int    `avro:"id" json:"id"`
    Name      string `avro:"name" json:"name"`
    Age       int    `avro:"age" json:"age"`
    Email     string `avro:"email" json:"email"`
    Timestamp int64  `avro:"timestamp" json:"timestamp"`
}

// ...

avroschema.Reflect(&User{})

此外,一旦您拥有了 avro 架构,请查看 github.com/hamba/avro,以使用新架构将结构体实例与二进制 avro 进行序列化。

来自他们的自述文件:

type SimpleRecord struct {
    A int64  `avro:"a"`
    B string `avro:"b"`
}

schema, err := avro.Parse(`{
    "type": "record",
    "name": "simple",
    "namespace": "org.hamba.avro",
    "fields" : [
        {"name": "a", "type": "long"},
        {"name": "b", "type": "string"}
    ]
}`)
if err != nil {
    log.Fatal(err)
}

in := SimpleRecord{A: 27, B: "foo"}

data, err := avro.Marshal(schema, in)
if err != nil {
    log.Fatal(err)
}

fmt.Println(data)
// Outputs: [54 6 102 111 111]

out := SimpleRecord{}
err = avro.Unmarshal(schema, data, &out)
if err != nil {
    log.Fatal(err)
}

fmt.Println(out)
// Outputs: {27 foo}
© www.soinside.com 2019 - 2024. All rights reserved.