跳转至

Schema 演进

本页总结 Tarsio 在版本演进中的稳定实践。 目标是在升级字段时保持新旧版本互通,并降低回滚风险。

示例代码

from tarsio import Struct, encode, field

class V1(Struct):
    id: int = field(tag=0)

class V2(Struct):
    id: int = field(tag=0)
    name: str | None = field(tag=1, default=None)

data = encode(V2(id=1, name="Ada"))
old = V1.decode(data)
assert old.id == 1

核心概念

演进规则

  • 不复用旧 Tag 给新语义。
  • 新增字段优先使用可选字段并提供默认值。
  • 删除字段时保留 Tag 记录,避免后续误用。

兼容行为

  • 旧模型读取新数据时,未知 Tag 会被跳过。
  • 新模型读取旧数据时,缺失字段使用默认值。
  • 必填字段缺失会触发解码失败。

严格模式

forbid_unknown_tags=True 会把未知字段视为错误。 这适合强约束内部协议,但会降低跨版本容错能力。

注意事项

  • 版本发布前建议做双向回归: V1 -> V2V2 -> V1
  • 改动默认值会影响业务语义,需要单独评审。
  • 协议变更建议记录在 changelog 并附 Tag 变更表。