大きなテーブルのすべての行からデータを読み取る必要がありますが、一度にすべてのデータをメモリにプルしたくありません。ページングを処理するSQLAlchemy関数はありますか?つまり、いくつかの行をメモリにプルし、必要に応じてさらにフェッチします。
この記事 が示唆するように、limit
とoffset
を使用してこれを実行できることを理解していますが、必要がない場合は処理しません。
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
はゼロで除算された例外を返します
ReactJs、vueJsなどで使用する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
前のページの番号。
クエリ=なし
このページネーションオブジェクトの作成に使用された無制限のクエリオブジェクト。
合計=なし
クエリに一致するアイテムの総数
お役に立てば幸いです。
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()
私は最近、SQLAlchemyを使用してキーセットページングを実装するこのライブラリに出くわし、チェックする価値があるかもしれません。