J'ai besoin de lire les données de toutes les lignes d'une grande table, mais je ne veux pas extraire toutes les données en mémoire en même temps. Existe-t-il une fonction SQLAlchemy qui gérera la pagination? Autrement dit, tirez plusieurs lignes en mémoire, puis récupérez plus si nécessaire.
Je comprends que vous pouvez le faire avec limit
et offset
comme cet article le suggère, mais je préfère ne pas gérer cela si je n'ai pas à le faire.
Si vous utilisez Flask-SqlAlchemy, consultez la méthode paginate de query
. paginate
propose plusieurs méthodes pour simplifier la pagination.
record_query = Record.query.paginate(page, per_page, False)
total = record_query.total
record_items = record_query.items
La première page doit être 1 sinon le .total
renvoie une exception divisée par zéro
Voir cette réponse . En bref, vous pouvez utiliser le yield_per
opérateur.
Si vous construisez une API à utiliser avec ReactJs , vueJs ou autre framework frontEnd, vous pouvez traiter comme:
Remarquer:
page
: page actuelle dont vous avez besoin
error_out
: Ne pas afficher les erreurs
max_per_page
ou per_page
: la limite
Documentaion: pagination SqlAchemy
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)
Sur record_query vous pouvez utiliser:
suivant (error_out = False)
Renvoie un objet Pagination pour la page suivante.
next_num
Numéro de la page suivante
page = Aucune
le numéro de page actuel (1 indexé)
pages
Le nombre total de pages
per_page = Aucun
le nombre d'éléments à afficher sur une page.
prev (error_out = False)
Renvoie un objet Pagination pour la page précédente.
prev_num
Numéro de la page précédente.
query = None
l'objet de requête illimité utilisé pour créer cet objet de pagination.
total = Aucun
le nombre total d'éléments correspondant à la requête
J'espère que cela vous aidera!
Si vous n'utilisez pas Flask, vous pouvez utiliser la fonction SqlAlchemy 'slice' ou un combo 'limit' & 'offset', comme mentionné ici . Par exemple.:
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()
Je suis récemment tombé sur cette bibliothèque qui implémente la pagination des jeux de clés à l'aide de SQLAlchemy et pourrait être utile de la vérifier.