2010-11-15 33 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'將是一個動態列查找。

相關問題