Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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 for page获得特定数量的结果_Python_Python 3.x_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

python-使用SQLAlchemy for page获得特定数量的结果

python-使用SQLAlchemy for page获得特定数量的结果,python,python-3.x,flask,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个数据库,其中存储了用户帖子。现在我希望我的flask应用程序每页显示n篇帖子,但问题是,帖子可能会在某个时候被删除。 我的基本问题是: start = (page-1) * n postlist = Posts.query.filter(Posts.id > start).limit(n).all() 这将返回从开始处开始的n个帖子。这很好,除了如果有被删除的帖子,那么除1之外的其他页面的入门就不能正常工作。 假设帖子5和7被删除,第1页将显示帖子1-12,第2页将显示帖子11

我有一个数据库,其中存储了用户帖子。现在我希望我的flask应用程序每页显示n篇帖子,但问题是,帖子可能会在某个时候被删除。 我的基本问题是:

start = (page-1) * n 
postlist = Posts.query.filter(Posts.id > start).limit(n).all()
这将返回从开始处开始的n个帖子。这很好,除了如果有被删除的帖子,那么除1之外的其他页面的入门就不能正常工作。 假设帖子5和7被删除,第1页将显示帖子1-12,第2页将显示帖子11-20等等,这意味着一些帖子将显示在多个页面上。对于更大的数据库来说,这个问题将变得越来越严重

所以,我想到了两种方法来缓解这个问题,尽管我不喜欢这两种方法

a) 不是得到n个帖子,而是从一开始到另一开始+n:

start = (page-1) * n
end = start + n
postlist = Posts.query.filter(Posts.id > start).filter(Posts.id <= (start+n)).all()
然后使用end作为下一页的开始。但是:我必须通过GET为start提供新的值(看起来很难看),通过其通用url(/posts/page/#)访问特定页面将产生不同于使用前一个/下一个链接的结果,前一个/下一个链接将通过url提供?start=#参数


如果有人知道解决这个问题的方法,那就太好了;提前感谢。

您可以使用以下方法获得结果

通过使用页面和计数变量使用偏移和限制

page = kwargs.pop('page', None)
count = kwargs.pop('count', None)
page = page * count
postlist = Posts.query.filter(Posts.id.desc()).offset(page).limit(count).all()
另一种使用sqlalchemy Paginator的方法

from sqlalchemy_paginator import Paginator
page_size = 20
postlist_obj = Posts.query.filter(Posts.id.desc())
pagination = Paginator(postlist_obj,page_size)
一旦获得分页对象,就可以根据页码访问如下参数

page_number = 1
page = paginator.page(page_number)
total_pages=paginator.total_pages
total_records_count=paginator.page(paginator.total_pages).end_index
record)list = page.object_list

Flask SQLAlchemy
中的
BaseQuery
对象有一个名为的方法可以帮助您。@stamaimer谢谢,我不知道这个方法,这确实有助于解决问题谢谢,偏移和限制方法工作得很好,尽管我决定通过stamaimer提到的SQLAlchemy的分页函数使用分页方法。sqlalchemy_paginator对我不起作用,因为它试图导入一个类“exceptions”,它似乎是Django的一部分,而我没有使用它。不过,感谢您提到它,这让我真正了解了内置分页方法。
page_number = 1
page = paginator.page(page_number)
total_pages=paginator.total_pages
total_records_count=paginator.page(paginator.total_pages).end_index
record)list = page.object_list