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

如何将Python类(含SQLModel)转换为Avro Schema?

将SQLModel类转换为Avro Schema的Python方案

需求背景

我有一个简单的Python SQLModel类:

class Testo(SQLModel):
    name: str
    mea: int

调用Testo.schema()得到的JSON Schema输出为:

{
    "title": "Testo",
    "type": "object",
    "properties": {
        "name": {
            "title": "Name",
            "type": "string"
        },
        "mea": {
            "title": "Mea",
            "type": "integer"
        }
    },
    "required": [
        "name",
        "mea"
    ]
}

我需要基于这个JSON Schema生成Avro记录,通过在线转换工具得到的结果(仅需将name字段从"Record"改为"Testo")如下:

{
  "type": "record",
  "name": "Record",
  "fields": [
    {
      "name": "title",
      "type": "string"
    },
    {
      "name": "type",
      "type": "string"
    },
    {
      "name": "properties.name.title",
      "type": "string"
    },
    {
      "name": "properties.name.type",
      "type": "string"
    },
    {
      "name": "properties.mea.title",
      "type": "string"
    },
    {
      "name": "properties.mea.type",
      "type": "string"
    },
    {
      "name": "required",
      "type": {
        "type": "array",
        "items": "string"
      }
    }
  ]
}

想知道有哪些Python库可以完成这类转换(支持复杂Python模型/类),如果当前方法不合理,也请给出更优方案。

可行方案

一、直接支持JSON Schema转Avro的Python库

  • avro-json-schema
    专门用于JSON Schema与Avro Schema的双向转换,支持常见JSON Schema特性,可直接处理你给出的JSON Schema结构,转换时能通过参数指定记录名称(比如设为"Testo"),无需手动修改结果。
    示例代码:

    from avro_json_schema import to_avro_schema
    
    json_schema = {
        # 你的JSON Schema内容
    }
    avro_schema = to_avro_schema(json_schema, record_name="Testo")
    
  • jsonschema-to-avro
    轻量型转换库,专注于将JSON Schema转为Avro Schema,支持嵌套结构、必填字段等特性,可通过配置调整生成的记录名称,适配需求。

二、更优方案:直接从Python类生成Avro Schema

绕开JSON Schema中间步骤,直接从SQLModel(基于Pydantic)类生成Avro Schema,更高效且不易出错:

  • pydantic-avro
    针对Pydantic模型设计的工具,能直接将SQLModel/Pydantic类转换为Avro Schema,自动处理字段类型、必填项,生成的Schema中name会自动对应类名(即"Testo")。
    示例代码:

    from pydantic_avro import to_avro_schema
    from your_module import Testo
    
    avro_schema = to_avro_schema(Testo)
    
  • fastavro
    主流Avro处理库,配合Pydantic使用时,可通过自定义模型方法或辅助工具直接生成Avro Schema,同时支持Avro数据的序列化与反序列化,功能更全面。

三、核心注意事项

你之前得到的在线转换结果,本质是把JSON Schema本身的元数据转换成了Avro记录,这大概率不是真实需求。通常我们需要的是用Avro定义Testo类对应的实体数据结构,正确的目标Avro Schema应该是:

{
  "type": "record",
  "name": "Testo",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "mea", "type": "int"}
  ]
}

如果需求是生成上述结构,那么直接从Python类或JSON Schema转实体Avro Schema的方案才是合理的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:28:22