0

这似乎应该很简单,但是唉:

我有以下 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 的类定义吗?

4

1 回答 1

0

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

因此我可以跳过这一步

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

通过使用sql_readPandas 的方法如下:

import pandas as pd

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

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

于 2016-02-17T03:43:46.173 回答