python 将SQLAlchemy结果作为字典而不是列表返回[重复]

ztmd8pv5  于 2023-02-15  发布在  Python
关注(0)|答案(3)|浏览(217)
    • 此问题在此处已有答案**:

Retrieve query results as dict in SQLAlchemy(4个答案)
5小时前关门了。
当我检查查询结果时,它看起来像一个列表的列表。我想返回一个将列名Map到结果值的字典列表。我如何将结果行转换为字典?

results = db.session.query(
    PendingPost.campaign_id.label('campaign_id'),
    Campaign.title.label('title'),
    sqlalchemy.func.count(PendingPost.status).label('status_count'),
).join(
    Campaign, Campaign.id == PendingPost.campaign_id,
).join(
    Areas, Areas.id == PendingPost.area_id
).filter(
    sqlalchemy.func.month(PendingPost.creation_date) == datetime.datetime.utcnow().month
).group_by(
    PendingPost.status,
    PendingPost.campaign_id,
).all()

print(results)
[(3, 'campaign title', 1),
 (4, 'campaign title', 1)]
wtzytmuj

wtzytmuj1#

结果 * 看起来 * 像元组/列表,但它们实际上是一个特殊的Row对象(对于SQLAlchemy〈1.4,KeyedTuple)。使用_asdict()方法将每行转换为一个dict。

return [r._asdict() for r in results]
[{'campaign_id': 3, 'title': 'campaign title', 'status_count': 1},
 {'campaign_id': 4, 'title': 'campaign title', 'status_count': 1}]
vdgimpew

vdgimpew2#

在Python 3.7 / SQLAlchemy 1.3.18中,这对我来说是有效的:

return [dict(r) for r in results]
htrmnn0y

htrmnn0y3#

从SQLAlchemy 1.4及更高版本开始,Query返回的“KeyedTuple”对象被Row替换。
这意味着这将不再起作用:

[dict(r) for r in row_list]

我能够通过以下细微的更改使它在SQLAlchemy 2.0中工作:

[dict(r._mapping) for r in row_list]

相关问题