【发布时间】:2020-01-26 20:25:47
【问题描述】:
我有两个表 Orders 和 OrderItems。这是一种常见的设置,OrderItems 有一个将其链接到 Orders 的外键。所以我们有一个从 Orders 到 OrderItems 的一对多连接。 注意:表格在现实生活中会有更多的字段。
Orders OrderItems
+---------+ +-------------+---------+
| orderId | | orderItemId | orderId |
+---------+ +-------------+---------+
| 1 | | 5 | 1 |
| 2 | | 6 | 1 |
| | | 7 | 2 |
+---------+ +-------------+---------+
我正在使用 SQLAlchemy 来反映现有数据库。所以要查询这些数据,我会做类似的事情
ordersTable = db.Model.metadata.tables['Orders']
orderItemsTable = db.Model.metadata.tables['OrdersItems']
statement = ordersTable.join(orderItemsTable, ordersTable.c.orderId==orderItemsTable.c.orderId).select()
result = db.engine.execute(statement)
rlist = [dict(row) for row in result.fetchall()]
return flask.jsonify(rlist)
但是这个输出的问题是,由于连接,我从 Orders 表中获得了重复的信息。例如。您可以看到,因为 orderId 有两个项目,所以我将两次获取 Orders 表中的所有内容。
我追求的是一种从选择查询 aboce 获取嵌套 JSON 输出的方法。如:
[
{
"orderId": 1,
"orderItems": [
{ "orderItemId": 5 },
{ "orderItemId": 6 }
]
},
{
"orderId": 2,
"orderItems":[
{ "orderItemId": 7 }
]
}
]
这个问题之前已经提出过 How do I produce nested JSON from database query with joins? Using Python / SQLAlchemy 我花了很多时间查看 Marshmallow 文档,但我找不到如何使用我上面概述的查询类型来实现它。
【问题讨论】:
标签: python sqlalchemy marshmallow