空分页对象 sqlalchemy



我正在使用sqlalchemy使用分页函数检索对象列表

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

查询应该非常快,因为它位于表的主键上,因此将使用索引。只需确保选择不存在的内容,例如 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()

最新更新