Оптимизация сериализации с помощью 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 может обрабатывать список кортежей, поскольку в документации к 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?


person horcle_buzz    schedule 02.02.2016    source источник


Ответы (1)


Решение для оптимизации моего кода состояло в том, чтобы перейти непосредственно от моего объекта запроса SQLAlchemy к фрейму данных pandas (я забыл упомянуть, что я делаю тяжелую работу в pandas после того, как получу запрошенный набор записей).

Таким образом, я смог пропустить этот шаг

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

используя метод sql_read Pandas следующим образом:

import pandas as pd

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

а затем выполняю все мои манипуляции с данными и вращения, тем самым сокращая время обработки на несколько секунд.

person horcle_buzz    schedule 17.02.2016