SQLAlchemy和分页

时间:2012-03-28 21:41:58

标签: pagination sqlalchemy

我需要从大表的所有行读取数据,但我不想一次将所有数据都拉入内存。是否有一个SQLAlchemy函数将处理分页?也就是说,将几行拉入内存,然后在必要时获取更多内容。

我知道您可以使用limitoffset作为this article建议,但如果我不需要,我宁愿不处理。

5 个答案:

答案 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_pageper_page限制

文档:SqlAchemy pagination

    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实现键集分页的库,可能值得检查。

https://github.com/djrobstep/sqlakeyset