簡體   English   中英

如何使用 graphene_sqlalchemy 返回不同的值?

[英]How do I return distinct values with graphene_sqlalchemy?

我正在嘗試從 GraphQL 查詢返回不同的值。

from graphene_sqlalchemy import SQLAlchemyConnectionField
import graphene
from database.model import MyModel


class Query(graphene.ObjectType):
    """Query objects for GraphQL API."""
    node = graphene.relay.Node.Field()
    distinct_values = graphene.List(graphene.String, search=graphene.String())

    def resolve_distinct_values(self, info, search=None, **kwargs):
        return MyModel.field.distinct()

schema = graphene.Schema(query=Query)

我從我的 distinctValues 查詢收到的響應是:

    {
      "message": "User Error: expected iterable, but did not find one for field Query.distinctValues."
    }

一定有一些簡單的東西我在這里忽略了。 distinct() 打算做什么?

SQLAlchemy 的distinct方法用於向查詢添加DISTINCT子句。 DISTINCT將刪除所有重復的行。

如果您使用的是 PostgreSQL,您還可以使用可選參數distinct(*expr)來呈現DISTINCT ON (<expressions>)子句。 這將僅保留給定表達式 ( *expr ) 計算結果相等的每組行的“第一行”。 您需要使用 SQLAlchemy 的order_by方法來確保所需的行首先出現。

SQLAlchemy 的 Query.distinct(*expr) 方法

PostgreSQL 的 DISTINCT 子句

此示例展示了一個游戲,其中玩家可以前往不同的島嶼,每次玩家到達島嶼時都會記錄一次訪問。 我們可以使用lastVisit字段來顯示最近訪問過每個島嶼的玩家。

# models.py
import enum
from sqlalchemy import Column, DateTime, Enum, ForeignKey, Integer, String, orm, sql

class Player(Base):
    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique=True)
    visits = orm.relationship("Visit", backref="visitor")

class Island(enum.Enum):
    Amity = "amity"
    IslaNublar = "islanublar"
    Skull = "skull"
    Treasure = "treasure"

class Visit(Base):
    id = Column(Integer, primary_key=True)
    island = Column(
        Enum(Island, name="island", values_callable=lambda x: [e.value for e in x]),
        nullable=False,
    )
    arrived_at = Column(DateTime(timezone=False), nullable=False, server_default=sql.func.now(), index=True)
    player_id = Column(ForeignKey("players.id"), nullable=False)

# schema.py
from sqlalchemy import orm
from models import Player as PlayerModel, Visit as VisitModel

class Player(SQLAlchemyObjectType):
    class Meta:
        model = PlayerModel
        interfaces = (relay.Node,)

class Visit(SQLAlchemyObjectType):
    class Meta:
        model = VisitModel
        interfaces = (relay.Node,)

class Query(graphene.ObjectType):
    node = relay.Node.Field()

    last_visit = SQLAlchemyConnectionField(Visit.connection, sort=None)

    def resolve_last_visit(self, info):
        return (
            VisitModel.query.options(orm.joinedload(VisitModel.visitor))
            .distinct(VisitModel.island)
            .order_by(VisitModel.island, VisitModel.arrived_at.desc())
            .all()
        )


schema = graphene.Schema(query=Query)

這個查詢:

{
  lastVisit {
    edges {
      node {
        island
        visitor {
          username
        }
      }
    }
  }
}

會產生這樣的結果:

{
  "data": {
    "lastVisit": {
      "edges": [
        {
          "node": {
            "island": "AMITY",
            "visitor": {
              "username": "playertwo"
            }
          }
        },
        {
          "node": {
            "island": "ISLA_NUBLAR",
            "visitor": {
              "username": "playerthree"
            }
          }
        },
        {
          "node": {
            "island": "SKULL",
            "visitor": {
              "username": "playerone"
            }
          }
        },
        {
          "node": {
            "island": "TREASURE",
            "visitor": {
              "username": "playerthree"
            }
          }
        }
      ]
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM