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

时间:2016-02-02 22:27:57

标签: python optimization serialization sqlalchemy marshmallow

这似乎应该是直截了当的,但唉:

我有以下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可以处理元组列表,因为在serialize方法下的marshaling.py文档中,它说: "获取原始数据(字典,列表或其他对象)和...的字典..."但是,这可能是一个错误的假设,认为元组列表可以归类为" list"或者"其他物品。"

我非常喜欢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的类定义?

1 个答案:

答案 0 :(得分:0)

优化我的代码的解决方案是直接从我的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)

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

相关问题