Я пытаюсь запросить таблицу и вернуть только те результаты, которые соответствуют условию агрегации объединенной таблицы.В частности, скажем, у нас есть две таблицы A
и B
, определенные как таковые (декларативная база) с отношением один-ко-многим:
class A(Base):
__tablename__ = "a"
id = Column(Integer, primary_key=True)
bees = relationship("B", back_populates="a", lazy="joined")
class B(Base):
__tablename__ = "b"
id = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey("a.id"), index=True)
a = relationship("A", back_populates="bees")
state = Column(String)
value = Column(Integer)
Я хочу иметь возможность запросить A
по результату агрегации B
, например "вернуть все А, для которых сумма значений связанных В, имеющих состояние, равное" ВЫПОЛНЕНО ", больше 20000" .
Если я не ошибаюсь, это соответствует следующему запросу SQL (возвращающему только идентификаторы объектов A):
SELECT a.id
FROM a LEFT OUTER JOIN b ON a.id = b.a_id
group by a.id
having sum(case when b.state='DONE' then b.value end else 0) > 20000
В идеале я хотел бы использовать гибридсвойство (назовем его remaining_value
), чтобы я мог запросить его, например, session.query(A).filter(A.remaining_value > 20000)
или session.query(A).group_by(A.id).having(A.remaining_value > 20000)
.