[英]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) 方法。
此示例展示了一個游戲,其中玩家可以前往不同的島嶼,每次玩家到達島嶼時都會記錄一次訪問。 我們可以使用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.