Вложенный JSON вывод SQLAlchemy Query with Join - PullRequest
0 голосов
/ 26 января 2020

У меня есть две таблицы 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, но не могу найти, как реализовать это, используя тип запроса, который я обрисовал выше.

...