SQLAlchemy在SQL端复制客户端方法

时间:2018-01-02 22:14:44

标签: python sqlalchemy

注意:这是我在这里尝试做的简单示例。

我有以下父子关系都是从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方法。我似乎无法在使用QuerySelectable,混合属性表达式与混合方法表达式等时使用。

0 个答案:

没有答案