web-dev-qa-db-fra.com

SQLAlchemy et passer par un grand ensemble de résultats

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.

21
Kevin Burke

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

24
radeklos

Voir cette réponse . En bref, vous pouvez utiliser le yield_per opérateur.

13
MrGomez

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!

3
Boston Kenne

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

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.

https://github.com/djrobstep/sqlakeyset

0
prafi