2009-04-28 13 views
12

duplicados de"how does one get a count of rows in a datastore model in google appengine?"Google AppEngine: cómo contar las entradas de una base de datos más allá de 1000?


Quiero saber cuántos usuarios que tengo. Anteriormente, he logrado esto con el siguiente código:

users = UserStore.all() 
user_count = users.count() 

Pero ahora tengo más de 1.000 usuarios y este método continúa a devolver 1.000.

¿Existe una manera programática eficiente de saber cuántos usuarios tengo?

Respuesta

14

De hecho, es un duplicado y el otro post describe cómo hacerlo teóricamente, pero me gustaría hacer hincapié en que realmente no debería estar haciendo conteos de esta manera. La razón es que BigTable por su naturaleza distribuida es realmente malo para los agregados. Lo que probablemente quiera hacer es agregar un contador transaccional a esa entidad, y si hay muchas transacciones, un contador desglosado. Ver: http://code.google.com/appengine/articles/sharding_counters.html

ACTUALIZACIÓN: Desde 1.3.1 cursores hacer cosas como esta mucho más fácil: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors

+2

1000. Contar a cada usuario para cada solicitud es una muy mala idea. –

+0

¡Terminé implementando esto! Gracias a un millón, mi rendimiento mejoró mucho (: –

+0

Otra forma de lograr esto sin tener que implementar contadores de sharding es accediendo a las estadísticas del Datastore. Aquí hay una explicación completa de 3 métodos para contar el número de entradas para un tipo específico: https://blog.svpino.com/2015/03/08/how-to-count-all-entries-of-a-given-type-in-the-app-engine-datastore – svpino

2

Usa la paginación como estos ejemplos here.

0

tengo escribir este método para contar una consulta, pero ¿cómo dijo Nick Johnson tal vez es una mala idea ...

def query_counter (q, cursor=None, limit=500): 
    if cursor: 
     q.with_cursor (cursor) 
    count = q.count (limit=limit) 
    if count == limit: 
     return count + query_counter (q, q.cursor(), limit=limit) 
    return count 
2

Desde la versión 1.3.6 del SDK se ha eliminado el límite de 1000 sobre la función recuento. Por lo tanto, una llamada a la función conteo ahora devolverá el número exacto de entidades, incluso si hay más de 1000. La única limitación sería si tuviera tantas entidades que la función de conteo no regresara antes de que la solicitud tenga un tiempo de espera excedido.

+0

En lugar de usar count() , ¿qué tal el uso de len()? Compruebe aquí: http://alwaysthecritic.typepad.com/atc/2009/02/google-app-engine-query-and-querycount.html – DocWiki

+0

Ese método fue desde el momento en que todavía tenía el límite de 1000. –

Cuestiones relacionadas