【问题标题】:Serialization optimization using Marshmallow, other solutions使用 Marshmallow 进行序列化优化,其他解决方案
【发布时间】:2016-02-02 22:27:57
【问题描述】:

这看起来应该很简单,但是唉:

我有以下 SQLAlchemy 查询对象:

all = db.session.query(label('sid', distinct(Clinical.patient_sid))).all()

需要序列化输出,如 [{'sid': 1}, {'sid': 2},...]

为此,我尝试使用以下简单的 Marshmallow 架构:

class TestSchema(Schema):
    sid = fields.Int()

但是,当我这样做时

schema = TestSchema()
result = schema.dump(record)
print result
pprint(result.data)

我明白了:

MarshalResult(data={}, errors={})
{}

我的输出。

但是,当我只从查询中选择一行时,例如,

one_record = db.session.query(label('sid', distinct(Clinical.patient_sid))).first()

我得到了想要的结果:

MarshalResult(data={u'sid': 1}, errors={})
{u'sid': 1}

我知道带有 .all() 的查询正在返回数据,因为当我打印它时,我得到一个元组列表:

[(1L,), (2L,), (3L,), ...]

我假设 Marshmallow 可以处理元组列表,因为在序列化方法下 marshaling.py 的文档中,它说: “获取原始数据(字典、列表或其他对象)和...的字典” 但是,认为元组列表可以分类为“列表”或“其他对象”可能是错误的假设。

否则我喜欢 Marshmallow,并希望将其用作使用迭代方法序列化我的 SQLAlchemy 输出的优化,例如:

all = db.session.query(label('sid', distinct(Clinical.patient_sid)))

out = []
for result in all:
    data = {'sid': result.sid}
    out.append(data)

这对于大型记录集可能需要一段时间来处理。

编辑

即使 Marshmallow 能够将整个记录集序列化为 SQLAlchemy 的输出,我也不确定是否会提高速度,因为它看起来也对数据进行了迭代。

对于 SQLAlchemy 输出的优化序列化有什么建议,除了修改 Clinical 的类定义吗?

【问题讨论】:

    标签: python optimization serialization sqlalchemy marshmallow


    【解决方案1】:

    优化我的代码的解决方案是直接从我的 SQLAlchemy 查询对象转到 pandas 数据框(我忘了提到我在获得查询记录集后在 pandas 中做一些繁重的工作)。

    因此我可以跳过这一步

    out = []
    for result in all:
        data = {'sid': result.sid
        out.append(data)
    

    使用Pandas的@​​987654322@方法如下:

    import pandas as pd
    
    pd.read_sql(all.statement, all.session.bind)
    

    然后做我所有的数据操作和旋转,从而减少几秒钟的处理时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2020-11-01
      • 2017-07-05
      • 1970-01-01
      相关资源
      最近更新 更多