Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 空分页对象sqlalchemy_Python_Pagination_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 空分页对象sqlalchemy

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对象。有没有一种方法可以在不运行查询的情况下实现这一点?为了避免查询,您可能

我正在使用sqlalchemy使用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()
或者这样(更简洁但可读性较差):