Comment faire pour récupérer plus de 1000?
Comment puis-je récupérer plus de 1000 enregistrement à partir de la banque de données et de les mettre tous dans une seule liste à transmettre à django?
Vous devez vous connecter pour publier un commentaire.
À partir de la Version 1.3.6 (sorti en Août-17-2010), vous PEUT
De le changelog:
Juste pour le record de chercher la limite de 1000 entrées est maintenant révolue:
http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html
Citation:
App Engine vous donne une belle façon de "pagination" à travers les résultats par 1000 par la commande de Clés et en utilisant la dernière touche que la prochaine décalage. Ils fournissent même un exemple de code ici:
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Queries_on_Keys
Bien que leur exemple écarte les requêtes sur de nombreuses demandes, vous pouvez modifier la taille de la page à partir de 20 à 1000 et de la requête dans une boucle, la combinaison de la querysets. En outre, vous pouvez utiliser itertools pour relier les requêtes sans les évaluer, avant qu'ils ne soient nécessaires.
Par exemple, pour compter le nombre de lignes au-delà de 1000:
Chaque fois que cela apparaît comme une limitation, je me demande toujours "pourquoi avez-vous besoin de plus de 1 000 résultats?" Saviez-vous que Google lui-même, n'est pas de servir jusqu'à plus de 1 000 résultats? Essayez cette recherche: http://www.google.ca/search?hl=en&client=firefox-a&rls=org.mozilla:en-US:official&hs=qhu&q=1000+results&start=1000&sa=N je ne le savais pas jusqu'à récemment, parce que je n'avais jamais pris le temps de cliquer sur le 100e page de résultats de recherche sur une requête.
Si vous êtes de retour plus de 1000 résultats à l'utilisateur, puis je pense qu'il y a un gros problème à portée de main que le fait que la banque de données ne vous laissera pas faire.
Une (légitime) de la raison pour avoir besoin d'autant de résultats est si vous faisiez une grande opération sur les données et la présentation d'un résumé (par exemple, quelle est la moyenne de toutes ces données). La solution à ce problème (qui est parlé dans la Google I/O de parler) est de calculer la synthèse de données à la volée, comme il arrive, et de l'enregistrer.
Vous ne pouvez pas.
Partie de la FAQ indique qu'il n'existe aucun moyen que vous pouvez accéder au-delà de la ligne 1 000 d'une requête, l'augmentation de la "OFFSET" sera simplement résultat en moins de résultat,
ie: OFFSET 999 --> 1 résultat revient.
De Wikipedia:
De http://code.google.com/appengine/docs/whatisgoogleappengine.html
De http://code.google.com/appengine/docs/datastore/gqlreference.html
De http://code.google.com/appengine/docs/datastore/queryclass.html
Ce que cela signifie, c'est
Si vous avez une singulière requête, il n'existe aucun moyen de demander quelque chose à l'extérieur de la gamme 0-1000.
L'augmentation de compensation à lever la 0, de sorte
Sera de retour 1000 lignes,
et
Sera de retour 0 lignes, donc, ce qui rend impossible l', avec une seule syntaxe de la requête, il récupère les résultats 2000, que ce soit manuellement ou en utilisant l'API.
La seule plausible exception
Est de créer un index numérique sur la table, c'est à dire:
Si vos données ou une requête ne peut pas avoir cette 'ID' identificateur codé en dur, alors vous êtes hors de la chance
Ce 1K limiter problème est résolu.
Par le traitement de la Requête de l'objet comme un objet iterable: L'itérateur récupère les résultats de la banque de données en petits lots, ce qui permet pour l'application pour arrêter l'itération sur les résultats afin d'éviter l'extraction de plus que ce qui est nécessaire. L'itération s'arrête lorsque tous les résultats correspondant à la requête ont été récupérés. Comme avec fetch(), l'interface iterator ne pas mettre en cache les résultats, de sorte que la création d'un nouvel itérateur de l'objet de Requête ré-exécuter la requête.
Max taille des lots est de 1K. Et vous avez encore le auto de la banque de données des quotas.
Mais avec le plan 1.3.1 SDK, ils ont introduit les curseurs qui peuvent être sérialisés et enregistrées de sorte qu'une nouvelle invocation peut commencer la requête où elle s'est laissée.
Les 1000 limite d'enregistrement est une dure limite sur Google AppEngine.
Cette présentation http://sites.google.com/site/io/building-scalable-web-applications-with-google-app-engine explique la façon la plus efficace de la page par le biais de données à l'aide de AppEngine.
(Essentiellement par l'utilisation d'un identifiant numérique comme la clé et la spécification d'une clause where sur l'id.)
Bien que l'extraction de l'api à distance a toujours des problèmes lorsque plus de 1000 enregistrements. Nous avons écrit cette petite fonction pour effectuer une itération sur une table en morceaux:
nous sommes à l'aide de quelque chose dans notre
ModelBase
classe:Cela permet de contourner la 1000 limite de requête sur tous les modèles sans avoir à y penser. Je suppose qu'une des clés de la version serait tout aussi facile à mettre en œuvre.
Simple que cela. Notez qu'il existe une RPC pour chaque entité qui est beaucoup plus lent que d'aller chercher dans les morceaux. Donc, si vous êtes inquiet au sujet de la performance, procédez de la manière suivante:
Si vous avez moins de 1M éléments:
Sinon, utilisez un curseur.
Il convient également de noter que:
retourne 1000 max et ne doit pas être utilisé.
JJG: votre solution ci-dessus est génial, sauf qu'il provoque une boucle infinie si vous avez 0 enregistrements. (J'ai trouvé cela bien que les tests de certains de mes rapports localement).
J'ai modifié le début de la boucle while pour ressembler à ceci:
Pour ajouter le contenu de la deux requêtes:
Liste 1 contient maintenant tous les résultats 2000.
La solution proposée ne fonctionne que si les entrées sont triées par clé... Si vous êtes de tri par une autre colonne tout d'abord, vous devez toujours utiliser une limite(offset, comte) de la clause, alors les entrées de 1000 limitation continuent de s'appliquer. C'est la même chose si vous utilisez deux demandes : l'une pour la récupération des index (avec les conditions et tri) et l'autre à l'aide d'index en () avec un sous-ensemble d'index à partir de la première suite, que la première requête ne peut pas retourner de plus de 1000 clés ? (Google Requêtes sur les Touches l'article ne précise pas clairement si nous avons à trier par clé pour supprimer les 1000 résultats limitation)
Il est proche de la solution fournie par Gabriel, mais ne pas aller chercher les résultats, il seulement compte:
Fonctionne parfaitement pour mes requêtes, et rapide aussi (1.1 secondes à compter de 67 000 entités)
Notez que la requête ne doit pas être une inégalité de filtre ou d'un ensemble ou le curseur ne fonctionnera pas et vous obtiendrez cette exception:
Si vous utilisez NDB: