我需要从大表的所有行读取数据,但我不想一次将所有数据都拉入内存。是否有一个SQLAlchemy函数将处理分页?也就是说,将几行拉入内存,然后在必要时获取更多内容。
我知道您可以使用limit
和offset
作为this article建议,但如果我不需要,我宁愿不处理。
答案 0 :(得分:18)
如果您使用的是Flask-SqlAlchemy,请参阅query
的{{3}}方法。 paginate
提供了几种简化分页的方法。
record_query = Record.query.paginate(page, per_page, False)
total = record_query.total
record_items = record_query.items
第一页应为1,否则.total
返回异常除以零
答案 1 :(得分:14)
见this answer。简而言之,您可以使用yield_per
运算符。
答案 2 :(得分:3)
如果你没有使用Flask,你可以使用SqlAlchemy函数'slice'或'limit'的组合& 'offset',如上所述here。 E.g:
some_query = Query([TableBlaa])
query = some_query.limit(number_of_rows_per_page).offset(page_number*number_of_rows_per_page)
# -- OR --
query = some_query.slice(page_number*number_of_rows_per_page, (page_number*number_of_rows_per_page)+number_of_rows_per_page)
current_pages_rows = session.execute(query).fetchall()
答案 3 :(得分:3)
如果您要构建与 ReactJs , vueJs 或其他前端框架一起使用的api,则可以像这样处理:
注意:
page
:您需要的当前页面
error_out
:不显示错误
max_per_page
或per_page
:限制
record_query = Record.query.paginate(page=*Number*, error_out=False, max_per_page=15)
result = dict(datas=record_query.items,
total=record_query.total,
current_page=record_query.page,
per_page=record_query.per_page)
在 record_query 上,您可以使用:
next(error_out = False)
返回下一页的分页对象。
next_num
下一页编号
页面=无
当前页码(已索引1页)
页面
总页数
每页=无
页面上显示的项目数。
上一个(error_out = False)
返回上一页的分页对象。
上一个编号
上一页编号。
查询=无
用于创建此分页的无限查询对象 对象。
总计=无
与查询匹配的项目总数
希望它对您有帮助!
答案 4 :(得分:0)
我最近遇到了这个使用SQLAlchemy实现键集分页的库,可能值得检查。