带有过滤器的SQLAlchemy func.count

时间:2015-12-24 03:04:58

标签: python sqlalchemy flask-sqlalchemy

我正在使用像这样分页的框架:

def get_count_query(self):
    return self.session.query(func.count('*')).select_from(self.model)

def paginate(self):
    ... <irrelevant>...
    count = self.get_count_query.scalar()
    ...

我想覆盖get_count_query方法以使用我自己的查询,因为我过滤了一些结果而get_count_query只返回表中的所有元素。查询是动态创建的,例如,一个查询可以是:

Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
                                     Asset.assigned_to.isnot(None)),
                                     Asset.deleted_at.is_(None))

我可以使用query.count()轻松计算此查询中的元素:

def get_count_query(self):
    q = Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
                                             Asset.assigned_to.isnot(None)),
                                             Asset.deleted_at.is_(None))
    return q.count()

但是一旦到达.scalar()方法,这将失败(我无法删除此方法)。所以问题是:如何将func.count('*')应用于现有查询?

我可以从查询中检索过滤器并将其应用于func.count('*')查询吗?

1 个答案:

答案 0 :(得分:3)

您可以将select_fromjoinfilter

一起使用
def get_count_query(self):
    return self.session.query(func.count('*')).select_from(Asset).join(StatusLabel)\
                                              .filter(StatusLabel.status == 'Deployable', or_(
                                                      Asset.assigned_to.isnot(None),
                                                      Asset.deleted_at.is_(None)))

带子查询

def get_count_query(self):
    q = Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
                                             Asset.assigned_to.isnot(None)),
                                             Asset.deleted_at.is_(None))

    return self.session.query(func.count('*')).select_from(q.subquery())