2009-04-28 13 views
12

Duplizieren von"how does one get a count of rows in a datastore model in google appengine?"Google AppEngine: Wie zählt man die Einträge einer Datenbank über 1000 hinaus?


Ich möchte wissen, wie viele Nutzer die ich habe. Früher habe ich erreicht dies mit dem folgenden Code:

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

Aber jetzt habe ich mehr als 1.000 Benutzer und dieses Verfahren weiterhin 1000 zurückzukehren.

Gibt es eine effiziente programmatische Art zu wissen, wie viele Benutzer ich habe?

Antwort

14

Es ist in der Tat ein Duplikat und der andere Beitrag beschreibt, wie man es theoretisch macht, aber ich möchte betonen, dass Sie wirklich nicht zählen sollten zählt auf diese Weise. Der Grund dafür ist, dass BigTable aufgrund seiner verteilten Natur wirklich schlecht für Aggregate ist. Was Sie wahrscheinlich tun möchten, ist, einen Transaktionszähler zu dieser Entität hinzuzufügen, und, wenn es viele Transaktionen gibt, einen Zähler mit Sharded. Siehe: http://code.google.com/appengine/articles/sharding_counters.html

UPDATE: Seit 1.3.1 Cursor Sachen wie diese viel einfacher: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors

+2

+1000. Zählen jeden Benutzer für jede Anfrage ist eine wirklich schlechte Idee. –

+0

Ich habe dies umgesetzt! Tausend Dank, meine Leistung hat sich sehr verbessert (: –

+0

) Eine andere Möglichkeit dies zu erreichen, ohne Sharing Counter implementieren zu müssen, ist der Zugriff auf die Datastore Statistiken. Hier ist eine vollständige Erklärung von 3 Methoden um die Anzahl der Einträge für einen bestimmten Typ zu zählen: https://blog.svpino.com/2015/03/08/how-to-count-all-entries-of-a-given-type-in-the-app-engine-datastore – svpino

2

Verwenden Sie Paginierung wie diese Beispiele here.

0

Ich habe diese Methode schreibt eine Abfrage zu zählen, aber wie sagte Nick Johnson vielleicht ist es eine schlechte Idee ...

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

Seit Version 1.3.6 des SDK die Grenze von 1000 auf der Zählfunktion wird entfernt. Ein Aufruf der count-Funktion gibt nun die genaue Anzahl der Entitäten zurück, selbst wenn es mehr als 1000 gibt. Eine Einschränkung wäre nur, wenn Sie so viele Entitäten hätten, dass die count-Funktion nicht zurückgeliefert würde, bevor die Anfrage ein Timeout hat.

+0

Anstatt count() zu verwenden , Wie wäre es mit der Verwendung der Len()? Überprüfen Sie hier: http://alwaysthekritic.typepad.com/atc/2009/02/google-app-engine-query-and-querycount.html – DocWiki

+0

Diese Methode war von der Zeit, es immer noch hatte die Grenze von 1000. –