空的paginate对象sqlalchemy

时间:2016-05-30 22:32:01

标签: python pagination sqlalchemy flask-sqlalchemy

我使用sqlalchemy使用paginate函数

检索对象列表
results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False)

有时list_of_ids可能为空。我注意到这个列表为空的查询非常慢。还有一个警告告诉我查询空列表可能很慢。但是,为了保持我的功能简单,我需要一个空的paginate对象。有没有办法在不运行查询的情况下获得它?

1 个答案:

答案 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()