如何减少 Strawberry GraphQL 和 FastAPI 中一对多关联的数据库查询数量?

How can I reduce the number of database queries for a one to many association in Strawberry GraphQL and FastAPI?

我正在使用 FastAPI 和 Strawberry 开发 python GraphQL API 服务器,我正在实现此功能: 我有两个实体,用户和订单,它们具有一对多关联(一个用户可以有多个订单,一个订单只能有一个用户),我想获得一个用户列表,每个用户都有他们的订单列表.

如果我要用一个简单的 REST 端点来实现它,我可以进行第一个查询以获取用户,然后进行第二个查询以获取订单,在 python 代码中进行排序,用户每个订单属于基于外键值。

虽然使用 Strawberry GraphQL,但似乎我无法避免对每个用户进行查询,因为即使使用数据加载器模式,我仍然需要事先知道订单 ID,这使得响应时间很长较慢。

这个问题有解决办法吗?我的做法完全错误吗?

数据加载器函数本身可以进行分组。

async def load_orders_by_user(keys: list[int]) -> Iterable[list[Order]]:
    orders = # select * from order where user_id in keys
    groups = {key: [] for key in keys}  # dict maintains order
    for order in orders:
        groups[order.user_id].append(order)
    return groups.values()

该想法的变体:

  • 加载器也可以同时加载用户
  • 加载程序只能对订单 ids 进行分组,并对订单使用不同的数据加载程序