Frage

Nehmen wir an, dass ich das Modell Foo in GAE haben und diese Abfrage:

.

query = Foo.all (), um ( '- Taste ')

Ich mag den n-te Datensatz erhalten. Was ist der effizienteste Weg, um das zu erreichen?

Wird die Lösung Pause, wenn die Ordnungseigenschaft nicht eindeutig zuzuordnen sind, wie das unten:

.

query = Foo.all (), um ( '- Farbe ')

edit: n> 1000

bearbeiten 2: Ich möchte einen freundlichen Paging-Mechanismus entwickeln, die Seiten zur Verfügung (zB Seite 1, Seite 2, ... Seite 185) zeigt und erfordert eine „page = x?“ In der Abfragezeichenfolge anstelle einem "? Lesezeichen = XXX". Wenn page = x, die Abfrage der Datensätze holen aus dem ersten Datensatz dieser Seite beginnen.

War es hilfreich?

Lösung

Es gibt keine effiziente Art und Weise, dies zu tun - in jedem DBMS. In jedem Fall müssen Sie mindestens sequentiell durch den Index-Datensätze zu lesen an, bis Sie den n-te finden, dann den entsprechenden Datensatz suchen. Dies ist mehr oder weniger das, was Abruf (zählen, Offset) hat in GAE, mit der zusätzlichen Beschränkung von 1000 Datensatz.

Ein besserer Ansatz dazu ist ein ‚Lesezeichen‘ zu halten, der Wert des Feldes aus Sie auf die letzte Einheit sind befehle Ihnen abgerufen, und der Schlüssel des Unternehmens. Dann, wenn Sie wollen weitermachen, wo Sie aufgehört haben, können Sie den Wert des Felds als die untere Grenze einer Ungleichung Abfrage hinzufügen und Datensätze überspringen, bis Sie erreichen oder überschreiten die letzte Sie sahen.

Wenn Sie zur Verfügung stellen möchten ‚freundliche‘ Seitenversätze für die Benutzer, was Sie tun können, ist memcache zu verwenden, um eine Verbindung zwischen einem Start-Offset zu speichern und zu einem Lesezeichen (order_property, key) Tupels. Wenn Sie eine Seite erzeugen, einfügen oder das Lesezeichen für das Unternehmen im Anschluss an die letzte Aktualisierung. Wenn Sie eine Seite holen, um das Lesezeichen zu verwenden, wenn es vorhanden ist, oder es auf die harte Art und Weise erzeugen, die von Abfragen mit Versetzungen zu tun -. Potentiell mehrere Abfragen, wenn die hoch genug Offset

Andere Tipps

Dokumentation für die Query-Klasse finden Sie unter: http://code.google.com/appengine/docs/ python / Datenspeicher / queryclass.html # Abfrage

Die Abfrage-Klasse stellt holen Hexe nimmt eine Grenze und eine Offset in Ihrem Fall 1 und n

Die Laufzeit des Abrufs wächst linear mit dem Offset + der Grenze

so die einzige Möglichkeit, in Ihrem Fall zu optimieren wäre, um sicherzustellen, dass die Datensätze, die Sie wollen zugänglich sind meist näher am Anfang des Arrays.

Sie könnten verwenden query.filter ( 'key =', n) query.get ()

, die das erste Spiel mit einem Schlüssel von n zurückkehren würde

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top