Выражение, которое вы повторяете, вычисляет список объектов модели , а не строк. Итак, правильное их использование:
for u in session.query(User).all():
print u.id, u.name
Вам действительно нужно преобразовать их в dicts? Конечно, существует много способов, но тогда вам не нужна ORM-часть SQLAlchemy:
result = session.execute(User.__table__.select())
for row in result:
print dict(row)
Обновление: посмотрите модуль sqlalchemy.orm.attributes
. Он имеет набор функций для работы с состоянием объекта, который может быть вам полезен, особенно instance_dict()
.
Вы можете попробовать выполнить агрегацию
db.collection.aggregate([
{ "$unwind": "$aliases" },
{ "$addFields": { "aliasesCode": "$aliases" }},
{ "$lookup": {
"from": PromotionUsages.collection.name,
"let": { "aliases": "$aliases" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$code", "$$aliases" ] } } },
{ "$count": "countUsages" }
],
"as": "aliases"
}},
{ "$unwind": "$aliases" },
{ "$project": { "code": 1, "aliasCode": 1, "countUsages": "$aliases.countUsages" }}
])
Выход
{
"code": "AAA"
"aliasCode": "AAA1"
"countUsages": 2
}
Made some changes in solution suggested by Anthony Winzlet
db.promotions.aggregate([
{ "$unwind": "$aliases" },
{ "$addFields": { "aliasesCode": "$aliases" }},
{ "$lookup": {
"from": "promotionusages",
"let": { "aliases": "$aliases" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$code", "$$aliases" ] } } },
{ "$count": "countUsages" }
],
"as": "aliases"
}},
{ "$unwind": "$aliases" },
{ "$project": { "_id" : 0, "code": 1, "aliasesCode": 1, "countUsages": "$aliases.countUsages" }}
])