无法对sqlalchemy中的@hybrid_属性应用筛选器

无法对sqlalchemy中的@hybrid_属性应用筛选器,sqlalchemy,Sqlalchemy,代码很简单,如下所示: Class A(Base): status = Columns(Integer) @hybrid_property def is_ok(self): return self.status > 0 但是 将引发异常:TypeError:未定义此子句的布尔值 我已尝试打印结果[0]。是否正常,typeresult[0]。是否正常。这是真的 那么,如何基于混合_属性进行过滤呢 我的回答 在@van的帮助下,我知道怎么做 arg

代码很简单,如下所示:

Class A(Base):
    status = Columns(Integer)

    @hybrid_property
    def is_ok(self):
        return self.status > 0
但是

将引发异常:TypeError:未定义此子句的布尔值

我已尝试打印结果[0]。是否正常,typeresult[0]。是否正常。这是真的

那么,如何基于混合_属性进行过滤呢

我的回答

在@van的帮助下,我知道怎么做

arg take应该是一个。我曾经认为它需要一个布尔值作为arg,但不是

标准是适用于select的WHERE子句的任何SQL表达式对象。字符串表达式通过文本构造强制为SQL表达式构造

代码告诉我们:

# wrong code:
@is_ok.expression
def is_ok(self):
    return self.status > 30 and self.status < 90

# correct code:
from sqlalchemy.sql import and_
@is_ok.expression
def is_ok(self):
    return and_(self.status > 30, self.status < 90).label('is_ok')

添加自定义表达式。下面使用CASE语句,但如果db支持,也可以使用IF:

@is_ok.expression
def is_ok(cls):
    return case([(cls.status > 0, True)], else_=False).label("is_ok")

有关更多信息,请参阅文档。

如果我使用self.status>=30,则运行良好。但是如果我使用self.status>=30和self.status<90,它会升高。区别是什么?但是如果数据在实例级别呢?就像我的混合属性一样,它使用另一个混合属性来定义其值。现在转到类级别为我返回所有混合属性,而不是像self这样的独立实例的混合属性。@MattSom,您同时需要:实例属性和表达式。只有在简单的情况下,sqlalchemy才能在没有显式定义的情况下计算出表达式,但是对于像您最近的问题这样更复杂的问题:您需要有一个与属性定义相对应的定义良好的表达式。所以有两种不同的实现。那么在这种情况下,我必须再次实现used和‘main’混合属性逻辑?就像我的第一个HP使用了group by,第二个HP使用了group by。现在,对于第二个HP中的表达式,我需要为第一个HP再次定义一个分组实体,以便重建逻辑?这意味着,如果我的混合属性使用大量其他混合属性,则最后一个属性的表达式始终是重做工作。或者我应该为每个HP创建一个类级表达式,并以相同的方式使用它们?我可能误解了您原来的问题。不,您不需要从头开始重新实现,您完全可以重新使用您的实现,sqlalchemy将正确地组合这些实现。太好了。将您的解决方案添加为答案,并接受它作为一个良好的知识库。我认为您的表达是关键:小心打字:@is_ok.expressoin
@is_ok.expression
def is_ok(cls):
    return case([(cls.status > 0, True)], else_=False).label("is_ok")