我需要從大表的所有行讀取數據,但我不想將所有數據同時存入內存。是否有處理分頁的SQLAlchemy函數?也就是說,將多行拖入內存,然後在需要時抓取更多內容。SQLAlchemy和分頁
我知道你可以用limit
和offset
這樣做,因爲this article暗示,但我寧願不處理,如果我不必。
我需要從大表的所有行讀取數據,但我不想將所有數據同時存入內存。是否有處理分頁的SQLAlchemy函數?也就是說,將多行拖入內存,然後在需要時抓取更多內容。SQLAlchemy和分頁
我知道你可以用limit
和offset
這樣做,因爲this article暗示,但我寧願不處理,如果我不必。
請參閱this answer。總之,您可以使用yield_per
運營商。
如果您使用的是Flask-SqlAlchemy,請參閱方法query
。 paginate
提供了幾種簡化分頁的方法。
record_query = Record.query.paginate(page, per_page, False)
total = record_query.total
record_items = record_query.items
第一頁應爲1,否則返回.total
異常,如果你不使用瓶零
無視我的其他評論,這很好地工作,我只是在一個不相關的領域愚蠢地做'dict(** request.args),並得到意想不到的結果。 – robru 2015-08-12 01:11:28
沒有這可能仍然是一個壞主意,就像你檢查他們使用限制和偏移的來源。現在,如果偏移值太大,那麼數據庫會遍歷所有這些值,從而導致性能問題。 – 2017-06-28 12:32:46
分,你可以使用SQLAlchemy功能「切片」或「限價」 &組合「偏移',如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()
如果偏移量很高,則限制偏移量很差,因爲它已通過所有前面的行以獲取偏移量的行從而導致性能問題 – 2017-06-28 12:21:24
它看起來像在渲染網站的上下文中支持分頁...我只是想與數據庫交談,沒有前端。 – 2012-03-28 21:53:02
在數據庫層,'limit'和'offset'迭代實際上是最恰當的場景,完全如最初記錄的那樣。我相信這裏的基本原理就是數據庫_anyway_發生了什麼,因此,你可以提供自己的for循環。 :) – MrGomez 2012-03-28 21:56:29
其實不,我錯了。我正在更新我的答案,因爲我找到了更具權威性的資源。 – MrGomez 2012-03-28 21:58:50