如何将Python类(含SQLModel)转换为Avro Schema?
需求背景
我有一个简单的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

