簡體   English   中英

帶有過濾器的SQLAlchemy func.count

[英]SQLAlchemy func.count with filter

我正在使用一個像這樣分頁的框架:

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('*')查詢嗎?

你可以使用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())

暫無
暫無

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

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