跳转到主要内容

简化数据结构迁移的包

项目描述

Codecov Test Code Style Documentation Status PyPI version Conda-forge version

此支持包简化了用户会话和软件版本更新之间的数据持久化。

此包的主要思想是简化版本之间的数据迁移,并允许在数据结构定义旁边定义迁移信息。

基本用法(数据序列化)

如果您只需要序列化数据,则可以使用仅JSON钩子

import json

from pydantic import BaseModel
from local_migrator import Encoder, object_hook


class SampleModel(BaseModel):
    field1: int
    field2: str


data = SampleModel(field1=4, field2="abc")

with open("sample.json", "w") as f_p:
    json.dump(data, f_p, cls=Encoder)

with open("sample.json") as f_p:
    data2 = json.load(f_p, object_hook=object_hook)

assert data == data2

迁移

要注册此信息,可以使用register_class装饰器。它有4个参数

  • version - 数据结构版本

  • migration_list - 包含元组(version. migration_function)的列表。

  • old_paths - 包含先前类定义的完全限定Python路径的列表。这是为了允许在代码重构期间移动类。

  • use_parent_migrations - 如果为True,则将使用父类的迁移。

让我们假设我们有这样的代码

from local_migrator import Encoder, object_hook

class SampleModel(BaseModel):
    field1: int
    field_ca_1: str
    field_ca_2: float

with open("sample.json", "w") as f_p:
    json.dump(data, f_p, cls=Encoder)

但是有一个决定将ca字段移动到子结构

class CaModel(BaseModel):
    field_1: str
    field_2: float

class SampleModel(BaseModel):
    field1: int
    field_ca: CaModel

然后使用local_migrator代码可能看起来像这样

from local_migrator import object_hook, register_class

class CaModel(BaseModel):
    field_1: str
    field_2: float

def ca_migration_function(dkt):
    dkt["field_ca"] = CaModel(field1=dkt.pop("field_ca_1"),
                              field2=dkt.pop("field_ca_2"))
    return dkt

@register_class("0.0.1", [("0.0.1", ca_migration_function)])
class SampleModel(BaseModel):
    field1: int
    field_ca: CaModel

with open("sample.json") as f_p:
    data = json.load(f_p, object_hook=object_hook)

假设有一个决定将field1重命名为id。那么代码可能看起来像这样

from local_migrator import object_hook, register_class, rename_key

class CaModel(BaseModel):
    field_1: str
    field_2: float

def ca_migration_function(dkt):
    dkt["field_ca"] = CaModel(field1=dkt.pop("field_ca_1"),
                              field2=dkt.pop("field_ca_2"))
    return dkt

@register_class("0.0.2", [("0.0.1", ca_migration_function), ("0.0.2", rename_key("field1", "id"))])
class SampleModel(BaseModel):
    id: int
    field_ca: CaModel

with open("sample.json") as f_p:
    data = json.load(f_p, object_hook=object_hook)

更多示例可以在文档的示例部分找到

附加功能

  • rename_key(from_key: str, to_key: str, optional=False) -> Callable[[Dict], Dict] - 用于重命名字段迁移的辅助函数。

  • update_argument(argument_name:str)(func: Callable) -> Callable - 用于保持向后兼容性的装饰器,通过将 dict 参数转换为基于函数类型注解的某些类。

贡献

欢迎贡献!请创建拉取请求或打开问题。对于PR,请记得添加测试和文档。

附加说明

该软件包最初命名为 nme,但后来重命名为更清楚地说明其目的。

该软件包是从 PartSeg 项目提取的,以便在另一个项目中简化重用。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分发

local-migrator-0.1.10.tar.gz (24.6 kB 查看哈希值)

上传时间

构建分发

local_migrator-0.1.10-py3-none-any.whl (11.7 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面