将 SqlAlchemy group_by/func 查询转换为 GraphQL
Posted
技术标签:
【中文标题】将 SqlAlchemy group_by/func 查询转换为 GraphQL【英文标题】:Translating SqlAlchemy group_by/func query to GraphQL 【发布时间】:2021-11-03 04:28:27 【问题描述】:我正在使用 Graphene 和 SqlAlchemy 为咖啡馆订购应用程序构建 GraphQL 查询。到目前为止,我的查询主要是基于“加入”和“过滤”,但我现在需要向咖啡馆提供客户详细信息,包括客户光顾他们商店的次数和客户每次光顾的平均消费。所以我需要在我的 Graphene/SqlAlchemy 查询中使用 group_by、func.count 和 func.sum。这些查询已经足够成功了。但是,我不确定如何将 Graphene/SqlAlchemy 查询转换为 GraphQL 查询。
这是我的 Graphene/SqlAlchemy 查询。
cafe_customers = db.query(models.Customer.username, func.count(models.Order.ordered_by), func.sum(models.Order.price)).join(models.Order, models.Customer.id == models.Order.ordered_by).filter(models.Order.cafe_id == current_user).group_by(models.Customer.id).all()
这是我的 GraphQL 查询(我非常不确定如何进行)。
customersByCafe(token: "")
username
这是 GraphQL 返回的内容。
"data":
"customersByCafe": [
null,
null
]
,
"errors": [
"message": "Received incompatible instance \"('dave', 1, Decimal('11.00'))\"."
,
"message": "Received incompatible instance \"('geoff', 2, Decimal('50.00'))\"."
]
这里有一个类似的问题,与“在 graphql 查询中接收不兼容的实例”有关,解决方案是将 graphene.Field 更改为 graphene.List。我的查询设置为 graphene.List 并且我使用了不同的选项。注意到 GraphQL 正在向我返回我需要的数据,即按用户名分组的每个客户、他们对帐户登录的咖啡馆的总访问次数的整数和总支出的小数,数据存在明显错误没有以我可以在前端使用的方式返回。
看来我的问题在于我不知道如何将 Graphene/SqlAlchemy 转换为 GraphQL。我该怎么做呢?
【问题讨论】:
【参考方案1】:收到不兼容的实例“('dave', 1, Decimal('11.00'))” 您收到的是元组列表,从您的 SqlAlchemy 查询中,您应该返回一个对象/字典列表。
你也应该在这里提到你的架构。
【讨论】:
以上是关于将 SqlAlchemy group_by/func 查询转换为 GraphQL的主要内容,如果未能解决你的问题,请参考以下文章