2012-03-28 16 views
11

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

は示唆して、私はむしろ私が持っていない場合は、そのハンドルではないと思います。

答えて

13

this answerを参照してください。つまり、yield_per演算子を使用できます。

+0

ウェブサイトのレンダリングのコンテキストではページネーションがサポートされているようです...私はデータベースに接続しようとしていますが、フロントエンドはありません。データベース層、 'limit'と'・オフセット反復で –

+0

は、もともと文書化とおりに、実際に最も適切なシナリオです。私はここでの理論的根拠はデータベースの_anyway_で起こっていることだと思うので、あなた自身の 'for'ループを用意することもできます。 :) – MrGomez

+0

実際、いいえ、私は非常に間違っています。私はより明確なリソースを見つけたので、私の答えを更新しています。 、私はちょうど '愚か無関係な領域に、予期せぬ結果を得る(** request.args)'辞書をしていたされるよう – MrGomez

13

あなたはフラスコSQLAlchemyのを使用している場合は、querypaginate方法を参照してください。 paginateには、ページネーションを簡略化するいくつかの方法があります。

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

最初のページは、あなたがフラスコを使用していない場合は、ゼロ

+0

私の他のコメントを無視し、これを良好に動作します。 – robru

+0

これは、リミットとオフセットを使用しているソースをチェックした場合と同じように、悪い考えである可能性があります。それがオフセットされた行をフェッチするために、以前のすべての行を通過しているようになりましオフセット値が大きすぎる場合、データベースは、このようにパフォーマンス上の問題を引き起こし、これらの値のすべてを行くオフセットが..オフセット –

0

で割った1そう.total戻り例外である必要があり、あなたはSQLAlchemyの機能「スライス」または「制限」のコンボを使用することができます&「オフセット'と記載されているように、here。たとえば、

+0

リミットが悪い高く、パフォーマンス上の問題が発生します –