Sqlalchemy按计算列排序

时间:2013-06-06 15:29:06

标签: python sqlalchemy

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

基本上,我有一个'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创建一个getter,但它没有用。

2 个答案:

答案 0 :(得分:7)

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

使用已定义的列构建查询:

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

还可以将这样计算的列添加到Mapped Object类定义中:

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)

答案 1 :(得分:1)

sqlalchemy documentation现在似乎建议使用混合动力来做到这一点。

示例:

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运行典型的查询和订单。