我正在尝试使用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,但它没有用。
答案 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运行典型的查询和订单。