使用 Marshmallow 的序列化优化,其他解决方案

Serialization optimization using Marshmallow, other solutions

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

我有以下 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={})
{}

我的输出。

但是,当我只 select 来自我的查询的一行时,例如,

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 的文档中,它说: "Takes raw data (a dict, list, or other object) and a dict of..." 但是,认为元组列表可以 class 化为 "lists" 或 "other objects."

的假设可能是不正确的

否则我喜欢 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 的输出,我也不确定我是否会提高速度,因为它看起来也在迭代数据。

除了修改 Clinical 的 class 定义外,对 SQLAlchemy 输出的优化序列化有何建议?

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

因此我可以跳过这一步

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

使用Pandas的sql_read方法如下:

import pandas as pd

pd.read_sql(all.statement, all.session.bind)

然后进行我所有的数据操作和旋转,从而缩短了几秒钟的处理时间。