SQLAlchemy - 将表达式附加到模型

时间:2016-03-02 17:41:59

标签: python sqlalchemy

我有时需要在不同的查询中重用某个SQL表达式。如果表达式在所有情况下都查询同一个表,那么该模型似乎是一个很好的地方。但是,我并不总是需要标量属性,如果我不需要它,我就不会# 39;我想实施它。

以下是我的表现方式:

 @hybrid_property
 def some_property(self):
     """Allows the query-level expression to exist."""
     raise NotImplemented

 @some_property.expression
 def some_property(cls):
     """Query blah blah blah."""
     return case(
         ... snip ...
     ).label('some_property')

现在,标量实现什么都不做(引发NotImplemented)。我怎么能避免写它?

我不能将该表达式设为类属性,因为我需要引用其中的类,而不能在类级代码中引用类:

class A(object):
    c = A  # NameError

理论上我可以使它成为类级别的属性,但没有很好的实现。

我能想到的唯一选择是在创建类并将其分配回类之后创建表达式。这是邪恶的。

2 个答案:

答案 0 :(得分:1)

你不能这样做:

@declared_attr
def some_property(cls):
    """Query blah blah blah."""
    return case(
        ... snip ...
    ).label('some_property')

答案 1 :(得分:1)

您可以尝试将其作为column property实施。列属性就像一个只有表达式部分的混合属性(这是你想要的,对吧?)。有一些限制,但对我来说这通常是有效的。使用deferred=true可以避免在不需要时对其进行评估。

some_property = column_property(
  select(**some column**).where(**some conditon**),
  deferred=true
)