簡體   English   中英

空分頁對象 sqlalchemy

[英]empty paginate object sqlalchemy

我正在使用 sqlalchemy 使用 paginate 函數檢索對象列表

results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)

有時list_of_ids可以為空。 我注意到此列表為空的查詢非常慢。 還有一個警告告訴我查詢空列表可能很慢。 但是,為了保持我的功能簡單,我需要一個空的分頁對象。 有沒有辦法在不運行查詢的情況下獲得它?

為了避免查詢,您可能會混亂並實例化您自己的空Pagination對象實例,但執行一個不返回任何行的簡單、快速的查詢可能會更容易:

>>> empty_paginator = models.Object.query.filter_by(id=None).paginate()
>>> empty_paginator.items
[]
>>> empty_paginator.has_next
False

查詢應該非常快,因為它在表的主鍵上,因此將使用索引。 只要確保您選擇了不存在的東西,例如None的 id 。 然后像這樣使用它:

if list_of_ids:
    results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)
else:
    results = models.Object.query.filter_by(id=-1).paginate()

另一種方法是將Pagination對象子類化,覆蓋需要有效查詢對象的方法以避免進行查詢:

class EmptyPaginator(flask.ext.sqlalchemy.Pagination):
    def __init__(self):
        super(EmptyPaginator, self).__init__(None, 1, 1, 0, [])

    def next(self, error_out=False):
        self.page += 1
        return self

    def prev(self, error_out=False):
        self.page -= 1
        return self

像這樣使用它:

if list_of_ids:
    results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)
else:
    results = EmptyPaginator()

或者這個(更簡潔但可讀性更差):

results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) if list_of_ids else EmptyPaginator()

暫無
暫無

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

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