У меня есть две таблицы Orders и OrderItems. Это обычная настройка, при которой OrderItems имеет внешний ключ, связывающий его с заказами. Таким образом, у нас есть соединение один-ко-многим из 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 дважды.
Что мне нужно, так это способ получить вложенный вывод JSON из запроса select. Например:
[
{
"orderId": 1,
"orderItems": [
{ "orderItemId": 5 },
{ "orderItemId": 6 }
]
},
{
"orderId": 2,
"orderItems":[
{ "orderItemId": 7 }
]
}
]
Этот вопрос был поднят до Как создать вложенный JSON из запроса к базе данных с помощью объединений? Используя Python / SQLAlchemy Я потратил довольно много времени, просматривая документацию по Marshmallow, но не могу найти, как реализовать это, используя тип запроса, который я обрисовал выше.