python-使用SQLAlchemy for page获得特定数量的结果
我有一个数据库,其中存储了用户帖子。现在我希望我的flask应用程序每页显示n篇帖子,但问题是,帖子可能会在某个时候被删除。 我的基本问题是: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
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