I have two tables Orders and OrderItems. It's a common setup whereby OrderItems has a foreign key linking it to Orders. So we have a one-to-many join from Orders to OrderItems. Note: Tables would have many more fields in real life.
Orders OrderItems
+---------+ +-------------+---------+
| orderId | | orderItemId | orderId |
+---------+ +-------------+---------+
| 1 | | 5 | 1 |
| 2 | | 6 | 1 |
| | | 7 | 2 |
+---------+ +-------------+---------+
I'm using SQLAlchemy to reflect an existing database. So to query this data I do something like
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)
But the problem with this output is that I get duplicates of information from the Orders table due to the join. E.g. you can see that because orderId has two items I'll get everything in the Orders table twice.
What I'm after is a way to obtain a nested JSON output from the select query aboce. Such as:
[
{
"orderId": 1,
"orderItems": [
{ "orderItemId": 5 },
{ "orderItemId": 6 }
]
},
{
"orderId": 2,
"orderItems":[
{ "orderItemId": 7 }
]
}
]
This question has been raised before How do I produce nested JSON from database query with joins? Using Python / SQLAlchemy I've spent quite a bit of time looking over the Marshmallow documentation, but I cannot find how to implement this using the type of query that I outlined above.