2010-11-15 26 views
1

最后一个我就此指定的两个SQLAlchemy的模型对象更近的:如何找到一组实体比孩子

class SpecInstance(Base): 
    spec_id = Column(Integer, ForeignKey('spec.spec_id')) 
    details = Column(String) 

class Spec(Base): 
    spec_id = Column(Integer) 
    spec_date = Column(DateTime) 
    instances = relationship(SpecInstance, backref="spec", cascade="all, delete, delete-orphan") 

我要寻找一个查询,将只返回Spec对象有spec_date大于最近一次使用实例。例如,给定物体像这样:

Spec(spec_id=1, spec_date='2010-10-01') 
Spec(spec_id=2, spec_date='2010-10-02') 
Spec(spec_id=3, spec_date='2010-10-03') 

SpecInstance(spec_id=2, details='whatever') 

我想我的查询只返回规格3.规格2是不合格的,因为它有实例。规格1因为比规格2旧而不合格。

我该如何做?

回答

0

我没有测试这段代码,因为我非常肯定它会工作,设置env是一个开销。

在普通的SQL中,人们会用子查询来做到这一点。在SQLAlchemy中,以这种方式创建子查询:

sq = session.query(Spec.spec_date.label('most_recent'))\ 
      .join((SpecInstance, SpecInstance.spec_id==Spec.spec_id))\ 
      .order_by(desc(Spec.spec_date))\ 
      .limit(1).subquery() 

在这里,我们加入了两个表所以只有规格与SpecInstances都考虑在内,那么我们按日期排序他们,让最新的放在最上面,并采取只有第一个 - 最年轻的实例 - 我们只需要它的日期。这将不会被执行 - 它将作为子查询准备在:

session.query(Spec)\ 
     .join((sq, Spec.spec_date>sq.c.most_recent)) 

这是非常简单的。注意在联接结构上放置双括号,并在sq上的第二个查询中包含.c,因为'most_recent'将是一个动态列查找。

相关问题