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