Python 空分页对象sqlalchemy
我正在使用sqlalchemy使用paginate函数检索对象列表Python 空分页对象sqlalchemy,python,pagination,sqlalchemy,flask-sqlalchemy,Python,Pagination,Sqlalchemy,Flask Sqlalchemy,我正在使用sqlalchemy使用paginate函数检索对象列表 results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) 有时,ID列表可以为空。我注意到这个列表为空的查询非常慢。还有一个警告告诉我,查询空列表可能会很慢。然而,为了保持我的功能简单,我需要一个空的paginate对象。有没有一种方法可以在不运行查询的情况下实现这一点?为了避免查询,您可能
results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)
有时,
ID列表可以为空。我注意到这个列表为空的查询非常慢。还有一个警告告诉我,查询空列表可能会很慢。然而,为了保持我的功能简单,我需要一个空的paginate对象。有没有一种方法可以在不运行查询的情况下实现这一点?为了避免查询,您可能会搞乱并实例化自己的空分页对象实例,但执行简单、快速、不返回行的查询可能更容易:
>>> 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()
if list_of_ids:
results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)
else:
results = EmptyPaginator()
另一种方法是对分页
对象进行子类化,覆盖需要有效查询对象的方法,以避免进行查询:
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 = models.Object.query.filter_by(id=-1).paginate()
if list_of_ids:
results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)
else:
results = EmptyPaginator()
或者这样(更简洁但可读性较差):