簡體   English   中英

按查詢 output 列排序

[英]Order by query output column

我正在使用帶有 sqlalchemy 的石墨烯,並且我有一個包含計算字段的 output object。 該字段是根據一些輸入(查詢)參數計算的,或多或少看起來像這樣(為了簡化,讓我們考慮我正在計算f(x)=ax+b其中ab都是我的Thing表中的列):

import models

class Thing(SQLAlchemyObjectType):
    class Meta:
        model = models.Thing
        interfaces = (relay.Node, )

    f = graphene.Field(graphene.Float)

    def resolve_f(self, info):
        return self.a * info.context['x'] + self.b

在我的查詢中,我有以下內容,我想根據 function f的 output 對字段進行排序:

class Query(graphene.ObjectType):
    best_points = graphene.List(lambda: Thing, x = graphene.Float())

    def resolve_best_points(self, info, x):
        query = Thing.get_query(info)
        return query.all()

起初,我嘗試使用類似query.order_by("f").all()resolve_best_points中進行排序,但由於石墨烯似乎將此字段添加到解析器之外(即query.all()僅包含ab但不是f(a, b) )。

有沒有辦法以干凈的方式實現這一目標? Thing中添加一些選項? 或者也許在解析器中獲取 output 值然后排序? 或者更難看的東西,比如添加一個中間件來對resolve_best_points的輸出進行排序?

什么是可能的,可能的解決方案的優點/缺點是什么?

請注意,這與這個問題有些相關: Sqlalchemy order by computed column ,但這也有很大不同,因為這里我不希望僅基於數據庫字段進行計算(當前解決方案在涉及變量時不起作用,例如info.context['x']在這個玩具示例中)。

您可以使用 SQLAlchemy 的orm.with_expressionorm.query_expression函數將臨時表達式應用於您的查詢,然后在ORDER_BY子句中使用它們。

query_expression屬性添加到您的Thing model。

# models.py
from sqlalchemy import Float, Integer, orm

class Thing(Base):
    __tablename__ = 'things'
    id = Column(Integer, primary_key=True)
    a = Column(Float)
    b = Column(Float)

    expr = orm.query_expression()

您現在可以使用with_expression將任意 SQL 表達式傳遞給您的查詢。 Thing對象上expr屬性的值將是表達式的結果。

# schema.py
import graphene

from graphene import relay
from sqlalchemy.orm import with_expression

from models import Thing as ThingModel


class Thing(SQLAlchemyObjectType):
    class Meta:
        model = ThingModel
        interfaces = (relay.Node,)


class Query(graphene.ObjectType)
    best_points = graphene.List(Thing, x=graphene.Float())

    def resolve_best_points(self, info, x):
        expr = ThingModel.a * x + ThingModel.b

        return (
            Thing.get_query(info)
            .options(with_expression(ThingModel.expr, expr))
            .order_by(expr)
            .all()
        )

SQLAlchemy 文檔的此部分中提供了更多詳細信息和需要注意的注意事項列表: 查詢時 SQL 表達式作為映射屬性

暫無
暫無

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

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