【问题标题】:SQLAlchemy and going through a large result set [duplicate]SQLAlchemy 并通过大型结果集 [重复]
【发布时间】:2012-04-12 13:14:47
【问题描述】:

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

我知道您可以按照this article 的建议使用limitoffset 执行此操作,但如果我不必这样做,我宁愿不处理。

【问题讨论】:

标签: pagination sqlalchemy


【解决方案1】:

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

record_query = Record.query.paginate(page, per_page, False)
total = record_query.total
record_items = record_query.items

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

【讨论】:

  • 忽略我的其他 cmets,这很好用,我只是在不相关的领域愚蠢地做 dict(**request.args) 并得到意想不到的结果。
  • 不,这仍然是一个坏主意,就像您检查他们使用限制和偏移的来源一样。现在,如果偏移值太大,那么数据库将遍历所有这些值,从而导致性能问题..
【解决方案2】:

如果您正在构建一个与 ReactJsvueJs 或其他前端框架一起使用的 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 上,您可以使用:

下一个(error_out=False)

为下一页返回一个分页对象。

next_num

下一页的编号

页面 = 无

当前页码(1 个索引)

页面

总页数

per_page = 无

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

prev(error_out=False)

返回上一页的分页对象。

prev_num

上一页的编号。

查询 = 无

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

总计 = 无

与查询匹配的项目总数

希望对你有帮助!

【讨论】:

  • 请注意这是 Flask-SQLAchemy 而不是标准的 SqlAchemy。
【解决方案3】:

如果您不使用 Flask,您可以使用 SqlAlchemy 函数 'slice' 或 'limit' 和 'offset' 的组合,如 here 所述。例如:

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()

【讨论】:

  • 如果偏移量很高,则限制偏移量不好,因为它已经遍历所有先前的行来获取偏移的行,从而导致性能问题
  • @AbhishekJebaraj 如果我们不使用限制偏移量?有什么推荐???
  • @tyan Datetime 或任何其他合适的过滤器是一个很好的方法。因为限制偏移总是先获取行然后偏移。最好先过滤它们,然后再获取过滤后的。
  • 适当的分页还会返回有用的信息,例如总记录数、当前页的记录数、这是第一页还是最后一页等。
  • 这里的逻辑似乎是错误的。应该是 some_query.limit(number_of_rows_per_page).offset((page_number - 1) * number_of_rows_per_page) 之类的东西,切片逻辑似乎也有问题...
猜你喜欢
  • 2011-10-29
  • 2018-01-27
  • 2010-10-23
  • 2016-11-13
  • 1970-01-01
  • 2012-02-07
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多