簡體   English   中英

按SQLAlchemy中的孫子計數過濾

[英]Filter by grandchildren count in SQLAlchemy

我在構造查詢時遇到困難,其中A對象按C計數進行過濾,其中CA的孫子。 這是我當前的(簡化的)模型代碼:

class A(Base):
    __tablename__ = 'as'
    pk = Column(Integer, primary_key=True)

class B(Base):
    __tablename__ = 'bs'
    pk = Column(Integer, primary_key=True)
    a_id = Column(Integer, ForeignKey('as.pk')
    a = relationship('A', backref='bees')

class C(Base):
    __tablename = 'cs'
    pk = Column(Integer, primary_key=True)
    child_id = Column(Integer, ForeignKey('bs.id'))
    child = relationship('B', backref='cees')

我嘗試了以下查詢,但未成功:

DBSession.query(A).filter(func.count(A.bees.cees) == 5)
# Neither 'InstrumentedAttribute' object nor 'Comparator' object associated 
# with A.bees has an attribute 'cees'

DBSession.query(A).having(B.cees == 5)
# missing FROM-clause entry for table "bs"

所有幫助,不勝感激。

借助subquery

sq = (session.query(A.pk.label('a_pk'), func.count(C.pk).label('num_cees'))
      .outerjoin(B).outerjoin(C).group_by(A.pk)
      .having(func.count(C.pk) == 5) # toggle-comment-line
      ).subquery('c_count')

q = (session.query(A)
     .join(sq, A.pk == sq.c.a_pk)
     # .filter(sq.c.num_cees == 5) # toggle-comment-line
     )

您可以將過濾條件放在subquery或主query 僅注意在A中過濾0 (無)Cs的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM