我使用sqlalchemy使用paginate函数
检索对象列表results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)
有时list_of_ids
可能为空。我注意到这个列表为空的查询非常慢。还有一个警告告诉我查询空列表可能很慢。但是,为了保持我的功能简单,我需要一个空的paginate对象。有没有办法在不运行查询的情况下获得它?
答案 0 :(得分:1)
你可能会乱用并实例化你自己的空Pagination
对象实例以避免查询,但是执行一个不返回任何行的简单快速查询可能更容易:
>>> empty_paginator = models.Object.query.filter_by(id=None).paginate()
>>> empty_paginator.items
[]
>>> empty_paginator.has_next
False
查询应该非常快,因为它在表的主键上,因此将使用索引。只需确保选择不存在的内容,例如id为None
。然后像这样使用它:
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()