10 votes

Comment puis-je dire si le curseur retourné est le dernier curseur dans App Engine

Je m'excuse si j'ai manqué quelque chose de vraiment évident.

Je fais des appels successifs à app engine en utilisant des curseurs. Comment puis-je savoir si je suis sur le dernier curseur? La méthode actuelle que j'utilise maintenant est d'enregistrer le dernier curseur et ensuite de tester si ce curseur est égal au curseur actuellement retourné. Cela nécessite un appel supplémentaire au magasin de données qui est probablement inutile cependant.

Y a-t-il une meilleure façon de faire cela?

Merci!

19voto

moraes Points 6067

Je ne pense pas qu'il y ait un moyen de le faire avec ext.db en une seule appel au magasin de données, mais avec ndb c'est possible. Exemple :

query = Person.query(Person.name == 'Guido')
result, cursor, more = query.fetch_page(10)

Si l'utilisation du curseur retourné entraîne plus d'enregistrements, more sera True. Cela est fait intelligemment, en un seul appel RPC.

6voto

Chris Farmiloe Points 7769

Comme vous parlez du 'dernier curseur', je suppose que vous utilisez des curseurs pour une sorte de pagination, ce qui implique que vous allez récupérer les résultats par lots avec une limite.

Dans ce cas, vous saurez que vous êtes sur le dernier curseur lorsque vous avez moins de résultats retournés que votre limite.

limite = 100
resultats = Entity.all().with_cursor('x').fetch(limite)
if len(resultats)

5voto

Dave W. Smith Points 9470

Si vous voulez dire "ce curseur a-t-il atteint la fin des résultats de recherche", alors non, pas sans ramasser le curseur et essayer à nouveau. Si davantage d'entités sont ajoutées qui correspondent aux critères de recherche d'origine, de sorte qu'elles atterrissent logiquement "après" le curseur (par exemple, une requête qui trie par un horodatage croissant), alors réutiliser ce curseur enregistré vous permettra de récupérer ces nouvelles entités.

1voto

erickCo Points 75

J'utilise la même technique que Chris Familoe décrit, mais je fixe la limite à 1 de plus que ce que je veux retourner. Donc, dans l'exemple de Chris, je récupérerais 101 entités. 101 retournées signifie que j'ai une autre page avec au moins 1 dessus.

    recs = db_query.fetch(limit + 1, offset)

    # si moins d'enregistrements sont renvoyés que demandé, nous avons atteint la fin
    if len(recs) < limit + 1:
        lastpage = True
        entries = recs
    else:
        lastpage = False
        entries = recs[:-1]

0voto

Greivin López Points 111

Je sais que ce message est un peu vieux mais je cherchais une solution au même problème. Je l'ai trouvé dans ce excellent livre:

http://shop.oreilly.com/product/0636920017547.do

Voici le conseil:

    results = query.fetch(RESULTS_FOR_PAGE)

    new_cursor = query.cursor()
    query.with_cursor(new_cursor)
    has_more_results = query.count(1) == 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X