注意:这是我在这里尝试做的简单示例。
我有以下父子关系都是从declarative_base驱逐出来的。
class Parent(declartive_base):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
_children = relationship("Child", lazy='dynamic')
def total_for_date(self, date):
return sum([child.num for child in self._children.filter(Child.date == date)])
@classmethod
def total_for_date_query(cls, date):
#TODO Return a query that represents this...
pass
class Child(declarative_base):
__tablename__ = 'children'
id = Column(Integer, primary_key=True)
num = Column(Integer)
date = Column(Date)
parent_id = Column(Integer, ForeignKey('parents.id'))
_parent = relationship("Parent")
我想计算一个与父查询相关的孩子的总数。这可以通过python这样执行
q = session.query(Parent).filter(Parent.id_([4,5,10,...]))
total = sum([parent.total_for_date(datetime.date(2018, 1, 2)) for parent in q.all()])
然而,这里的计算是在python中完成的,并且给定了大量的数据,与SQL相比,它的表现也不尽如人意。
我试图找出一种方法,使用混合表达式,选择,sqlalchemy查询等在父级上有一个等效的方法,返回一个查询/ selectable /表达式,允许我对其执行计算SQL方面,但与其他方法相比,维护了类似的接口。
在此示例中,我想改为执行以下操作。
q = session.query(Parent).filter(Parent.id.in_([4,5,10]))
total = q.select_entity_from(Parent.total_for_date_query(datetime.date(2018, 1, 2))).scalar()
#Note idk if "select_entity_from" is what I want here
但我不知道如何填写等效的total_for_date_query
SQL方法。我似乎无法在使用Query
与Selectable
,混合属性表达式与混合方法表达式等时使用。