web-dev-qa-db-ja.com

SQLAlchemyと大きな結果セットの処理

大きなテーブルのすべての行からデータを読み取る必要がありますが、一度にすべてのデータをメモリにプルしたくありません。ページングを処理するSQLAlchemy関数はありますか?つまり、いくつかの行をメモリにプルし、必要に応じてさらにフェッチします。

この記事 が示唆するように、limitoffsetを使用してこれを実行できることを理解していますが、必要がない場合は処理しません。

21
Kevin Burke

Flask-SqlAlchemyを使用している場合は、queryの-​​ paginate メソッドを参照してください。 paginateは、ページ分割を簡単にするいくつかの方法を提供します。

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

最初のページは1でなければなりません。それ以外の場合は.totalはゼロで除算された例外を返します

24
radeklos

この答え を参照してください。つまり、 yield_per 演算子。

13
MrGomez

ReactJsvueJsなどで使用するAPIを構築している場合フロントエンドフレームワークでは、次のように処理できます。

通知:

page:必要な現在のページ

error_out:エラーを表示しません

max_per_pageまたはper_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)

次のページのPaginationオブジェクトを返します。

next_num

次のページの番号

ページ=なし

現在のページ番号(1インデックス付き)

ページ

総ページ数

per_page = None

ページに表示されるアイテムの数。

prev(error_out = False)

前のページのPaginationオブジェクトを返します。

prev_num

前のページの番号。

クエリ=なし

このページネーションオブジェクトの作成に使用された無制限のクエリオブジェクト。

合計=なし

クエリに一致するアイテムの総数

お役に立てば幸いです。

3
Boston Kenne

Flaskを使用していない場合は、SqlAlchemy関数「slice」または「limit」と「offset」の組み合わせを使用できます ここ 。例えば。:

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

私は最近、SQLAlchemyを使用してキーセットページングを実装するこのライブラリに出くわし、チェックする価値があるかもしれません。

https://github.com/djrobstep/sqlakeyset

0
prafi