8

我正在尝试使用 sqlalchemy 构建选择查询,但我需要按计算值对结果进行排序,但我不知道该怎么做。

基本上,我有一个 'start_time' 和 'end_time' 列,我想根据 start_time 和 end_time 对结果进行排序,但是如果 end_time < start_time 我想在其中添加 86400000:

end_time + (86400000 if end_time < start_time else 0)

我不知道该怎么做。是否有任何简单的方法可以将计算属性添加到我的表类并让查询检索该属性?

我尝试使用 @property 为计算的 end_time 创建一个吸气剂,但它没有用。

4

2 回答 2

12

首先,您需要定义将包含实现为 sql 函数的公式的列

比您使用定义的列构建查询:

col = tclass.end_time + case([(tclass.end_time<tclass.start_time, 86400000)], else_=0 )
q = session.query(col).order_by(col)
print q

还有一种方法可以将这样的计算列添加到映射对象类定义中:

class TName(Base):
    end_time = Column(Integer)
    start_time = Column(Integer)
    calc_column = end_time + case([(end_time<start_time, 86400000)], else_=0 )

q2 = session.query(TName.calc_column).order_by(TName.calc_column)
于 2013-06-06T18:33:12.837 回答
3

sqlalchemy文档现在似乎建议使用混合来执行此操作。

例子:

from sqlalchemy.ext.hybrid import hybrid_property

class Tname(Base):
    end_time = Column(Integer)
    start_time = Column(Integer)

    @hybrid_property
    def calc_column(self):
        if self.end_time < self.start_time:
            return self.end_time + 86400000 
        else: 
            return self.end_time

然后你可以运行一个典型的查询并按 calc_column 排序。

于 2015-07-15T22:04:49.893 回答