我为此示例(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
。我很确定这是因为我不知道如何选择我想要的记录,而且我把那个限制放在那里。
任何想法我做错了什么?
答案 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。