[英]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.