通过column_property选择记录

时间:2013-11-27 17:04:23

标签: sqlalchemy flask-sqlalchemy

我为此示例(Domain,Visit)简化了2个模型,我想通过列属性选择给定域的上次访问时间戳

Domain.last_visit = db.column_property(
  db.select(
    [ db.func.ifnull( Visit.timestamp, 0 ) ],
    Visit.domain_id == Domain.id
  ).order_by(Visit.timestamp.desc()).limit(1).correlate(Visit.__table__).label('domain_last_visit'),
  deferred = True
)

我的问题是该值始终返回NULL而不是0。我很确定这是因为我不知道如何选择我想要的记录,而且我把那个限制放在那里。

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果IFNULL中的行0,则Visit只会回退到timestamp = NULL。但是,如果Domain还没有相应的Visit记录,则不会涵盖这种情况。

实现结果的一种方法是使用MAX聚合而不是ORDER BY ... DESC和appy IFNULL来获得结果:

Domain.last_visit = column_property(
    select( [ func.ifnull(func.max( Visit.timestamp ), 0) ],
        Visit.domain_id == Domain.id
    ).correlate_except(Visit).label('domain_last_visit'),
    #deferred = True
)

请注意您的代码中使用的correlate_except代替correlate,但未正确过滤结果。

您可能还会考虑Hybrid Attributes