2012-03-28 61 views
11

我需要從大表的所有行讀取數據,但我不想將所有數據同時存入內存。是否有處理分頁的SQLAlchemy函數?也就是說,將多行拖入內存,然後在需要時抓取更多內容。SQLAlchemy和分頁

我知道你可以用limitoffset這樣做,因爲this article暗示,但我寧願不處理,如果我不必。

回答

13

請參閱this answer。總之,您可以使用yield_per運營商。

+0

它看起來像在渲染網站的上下文中支持分頁...我只是想與數據庫交談,沒有前端。 – 2012-03-28 21:53:02

+0

在數據庫層,'limit'和'offset'迭代實際上是最恰當的場景,完全如最初記錄的那樣。我相信這裏的基本原理就是數據庫_anyway_發生了什麼,因此,你可以提供自己的for循環。 :) – MrGomez 2012-03-28 21:56:29

+0

其實不,我錯了。我正在更新我的答案,因爲我找到了更具權威性的資源。 – MrGomez 2012-03-28 21:58:50

13

如果您使用的是Flask-SqlAlchemy,請參閱方法querypaginate提供了幾種簡化分頁的方法。

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

第一頁應爲1,否則返回.total異常,如果你不使用瓶零

+0

無視我的其他評論,這很好地工作,我只是在一個不相關的領域愚蠢地做'dict(** request.args),並得到意想不到的結果。 – robru 2015-08-12 01:11:28

+0

沒有這可能仍然是一個壞主意,就像你檢查他們使用限制和偏移的來源。現在,如果偏移值太大,那麼數據庫會遍歷所有這些值,從而導致性能問題。 – 2017-06-28 12:32:46

0

分,你可以使用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() 
+0

如果偏移量很高,則限制偏移量很差,因爲它已通過所有前面的行以獲取偏移量的行從而導致性能問題 – 2017-06-28 12:21:24