这似乎应该很简单,但是唉:
我有以下 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 的类定义吗?