跳转到主要内容

SQLAlchemy模型序列化器。

项目描述

https://img.shields.io/pypi/v/serialchemy.svg https://img.shields.io/pypi/pyversions/serialchemy.svg https://github.com/ESSS/serialchemy/workflows/build/badge.svg https://codecov.io/gh/ESSS/serialchemy/branch/master/graph/badge.svg https://img.shields.io/readthedocs/serialchemy.svg https://sonarcloud.io/api/project_badges/measure?project=ESSS_serialchemy&metric=alert_status

SQLAlchemy模型序列化。

动机

Serialchemy 是作为 Flask-RESTAlchemy 的一个模块开发的,Flask-RESTAlchemy 是一个使用 Flask 和 SQLAlchemy 创建 Restful API 的库。我们最初尝试了 marshmallow-sqlalchemy,这可能是 SQLAlchemy 模型序列化最知名的库,但我们遇到了 与嵌套模型相关的问题。我们还认为,从底层开始考虑 SQLAlchemy,而不是在 marshmallow-sqlalchemy(它需要在 marshmallow 之上设计和构建)的基础上设计和构建,可以构建一个更简单、更易于维护的解决方案。

如何使用它

序列化通用类型

假设我们有一个 Employee SQLAlchemy 模型声明

class Employee(Base):
    __tablename__ = "Employee"

    id = Column(Integer, primary_key=True)
    fullname = Column(String)
    admission = Column(DateTime, default=datetime(2000, 1, 1))
    company_id = Column(ForeignKey("Company.id"))
    company = relationship(Company)
    company_name = column_property(
        select([Company.name]).where(Company.id == company_id)
    )
    password = Column(String)

通用类型ModelSerializer 自动序列化

from serialchemy import ModelSerializer

emp = Employee(fullname="Roberto Silva", admission=datetime(2019, 4, 2))

serializer = ModelSerializer(Employee)
serializer.dump(emp)

# >>
{
    "id": None,
    "fullname": "Roberto Silva",
    "admission": "2019-04-02T00:00:00",
    "company_id": None,
    "company_name": None,
    "password": None,
}

可以使用相同的序列化器反序列化新项目

new_employee = {"fullname": "Jobson Gomes", "admission": "2018-02-03"}
serializer.load(new_employee)

# >> <Employee object at 0x000001C119DE3940>

序列化器不会提交到数据库。您必须自己这样做

emp = serializer.load(new_employee)
session.add(emp)
session.commit()

自定义序列化器

对于 通用类型 之外的所有内容,我们必须扩展 ModelSerializer

class EmployeeSerializer(ModelSerializer):

    password = Field(load_only=True)  # passwords should be only deserialized
    company = NestedModelField(Company)  # dump company as nested object


serializer = EmployeeSerializer(Employee)
serializer.dump(emp)
# >>
{
    "id": 1,
    "fullname": "Roberto Silva",
    "admission": "2019-04-02T00:00:00",
    "company": {"id": 3, "name": "Acme Co"},
}
扩展多态序列化器

一种可能性是将 SQLAlchemy 连接表继承及其子表一起序列化。为此,需要设置一个带有所需模型类名称的变量。以这个 Employee 类为例,假设它有一个连接表继承

class Employee(Base):
    ...
    type = Column(String(50))

    __mapper_args__ = {"polymorphic_identity": "employee", "polymorphic_on": type}


class Engineer(Employee):
    __tablename__ = "Engineer"
    id = Column(Integer, ForeignKey("employee.id"), primary_key=True)
    association = relationship(Association)

    __mapper_args__ = {
        "polymorphic_identity": "engineer",
    }

要在 Engineer 类上使用扩展的 ModelSerializer 类,应该创建序列化器如下

class EmployeeSerializer(
    PolymorphicModelSerializer
):  # Since this class will be polymorphic

    password = Field(load_only=True)
    company = NestedModelField(Company)


class EngineerSerializer(EmployeeSerializer):
    __model_class__ = Engineer  # This is the table Serialchemy will refer to
    association = NestedModelField(Association)

贡献

有关设置开发环境以及如何向 serialchemy 贡献的指导,请参阅 贡献指南

发布

关于如何创建新版本的提醒。

请注意,VERSION 应遵循语义版本控制,例如 X.Y.Z,例如:v1.0.5

  1. upstream/master 创建一个 release-VERSION 分支。

  2. 更新 CHANGELOG.rst

  3. 推送包含更改的分支。

  4. 一旦所有构建都通过,请将 VERSION 标签推送到 upstream

  5. 合并 PR。

历史记录

1.0.1 (2023-17-11)

  • 修复 setup.py 上的许可证位置

1.0.0 (2023-14-11)

  • 添加对 SQLAlchemy 强制(经典)映射的支持

  • 放弃对 Python 3.8 以下版本的支持

  • 放弃对 SQLAlchemy 1.3 的支持

0.4.0 (2023-12-11)

  • 修复:在多态序列化器中获取模型属性名称而不是表列名称

  • 将多态模型序列化器扩展到接受在搜索多态列键时也接受列描述符。

  • 添加对 Python 枚举序列化的支持

  • 将多态模型序列化器更改为支持继承模型的继承模型

  • 将字段更改为使用默认序列化器对非 None 值进行序列化

  • 添加对 sqlalchemy 1.4 的支持

  • 添加 EnumKeySerializer

0.3.0 (2019-17-07)

  • 将复合字段添加到模型的属性列表中,以便在序列化该字段时如果其类型在 EXTRA_SERIALIZERS 中。

  • 修复 SQLAlchemy 复合属性的错误

  • 添加了 dump 和 load 自由函数,以便用户可以快速将 SQLAlchemy 模型导出,而无需实例化 ModelSerializer。

0.2.0 (2019-03-22)

  • 修复:当反序列化嵌套模型时,如果 SQLAlchemy 模型主键属性名称与列名称不同,则会出错

  • 允许在运行时定义 EXTRA_SERIALIZERS

  • 在序列化/反序列化嵌套字段时检查是否给出了会话

0.1.0 (2019-02-12)

  • 在 PyPI 上的首次发布。

项目详情


下载文件

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

源代码分发

serialchemy-1.0.1.tar.gz (30.2 kB 查看哈希值)

上传时间 源代码

构建分发

serialchemy-1.0.1-py3-none-any.whl (36.5 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

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