将 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的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy:自动将列名映射到值

SQLAlchemy - 将日期时间设置为字符串并获取日期?

可以将 SQLAlchemy 配置为非阻塞吗?

如何将此 SQL 查询转换为 SQLAlchemy

如何将 SqlAlchemy 结果序列化为 JSON?

将 postgresql 与 sqlalchemy 连接起来