这似乎应该是直截了当的,但唉:
我有以下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的类定义?
答案 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)
然后进行所有数据操作和旋转,从而减少几秒钟的处理时间。