SQLAlchemy和分页

Kev*_*rke 18 pagination sqlalchemy

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

我知道你可以这样做limit,offset正如本文所暗示的那样,但如果我不需要,我宁愿不处理.

rad*_*los 25

如果您使用的是Flask-SqlAlchemy,请参阅的paginate方法query.paginate提供了几种简化分页的方法.

record_query = Record.query.paginate(page, per_page, False)
total = record_query.total
record_items = record_query.items
Run Code Online (Sandbox Code Playgroud)

第一页应为1,否则.total返回异常除以零


Cub*_*t88 12

如果你不使用瓶,你可以使用SQLAlchemy功能“片”或“限制”和“抵消”组合,提到这里。例如:

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()
Run Code Online (Sandbox Code Playgroud)

  • 如果偏移量很大,则限制偏移量是不好的,因为它已经遍历了所有先前的行来获取偏移的行,从而导致性能问题 (4认同)
  • @AbhishekJebaraj 如果我们不使用限制偏移量?有推荐吗??? (2认同)
  • @tyan Datetime 或任何其他合适的过滤器是一个很好的方法。因为限制偏移总是获取行然后偏移。最好过滤它们,然后取而代之的是获取过滤后的那些。 (2认同)
  • 这里的逻辑似乎是错误的。它应该类似于 `some_query.limit(number_of_rows_per_page).offset((page_number - 1) * number_of_rows_per_page)` 切片逻辑似乎也错误...... (2认同)

Bos*_*nne 8

如果你正在构建一个与ReactJsvueJs或其他前端框架一起使用的 api ,你可以像这样处理:

注意:

page:您需要的当前页面

error_out: 不显示错误

max_per_pageper_page极限

文档: SqlAchemy 分页

    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)
Run Code Online (Sandbox Code Playgroud)

record_query 上,您可以使用:

下一个(error_out=假)

返回下一页的分页对象。

next_num

下一页的编号

页 = 无

当前页码(1 个索引)

总页数

per_page = 无

要在页面上显示的项目数。

上一个(error_out=假)

返回上一页的分页对象。

上一个编号

上一页的编号。

查询 = 无

用于创建此分页对象的无限制查询对象。

总计 = 无

与查询匹配的项目总数

希望对你有帮助!

  • 请注意,这是 Flask-SQLAchemy,而不是标准 SqlAchemy。 (5认同)