2009-07-25 6 views
5

Ich habe ein Modell, unten, und ich möchte alle eindeutigen area Werte erhalten. Die SQL-äquivalent ist select distinct area from tutorialsSo erhalten Sie den eindeutigen Wert eines meiner Modelle in Google App Engine

class Tutorials(db.Model): 
    path = db.StringProperty() 
    area = db.StringProperty() 
    sub_area = db.StringProperty() 
    title = db.StringProperty() 
    content = db.BlobProperty() 
    rating = db.RatingProperty() 
    publishedDate = db.DateTimeProperty() 
    published = db.BooleanProperty() 

Ich weiß, dass in Python I

a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com'] 
b = set(a) 
    b 
    >>> set(['livejournal.com', 'google.com', 'stackoverflow.com']) 

tun können, aber das würde mich erfordern, um die Gegend Elemente aus der Abfrage in einer anderen Liste zu bewegen und dann auf der Liste gesetzt Laufen (klingt sehr ineffizient) und wenn ich ein unterschiedliches Element in Position 1001 im Datenspeicher habe, würde ich es wegen der Abrufgrenze von 1000 nicht sehen.

Ich möchte alle eindeutigen Werte von Bereich in meinem Datenspeicher erhalten um es als l auf den Bildschirm auszugeben Tinten.

Antwort

7

Datenspeicher kann dies nicht in einer einzigen Abfrage für Sie erledigen. Eine Datenspeicheranforderung gibt immer einen fortlaufenden Ergebnisblock aus einem Index zurück, und ein Index besteht immer aus allen Entitäten eines bestimmten Typs, die nach den angegebenen Ordnern sortiert sind. Es gibt keine Möglichkeit, dass die Abfrage Elemente überspringt, nur weil ein Feld doppelte Werte enthält.

Eine Möglichkeit besteht darin, Ihre Daten neu zu strukturieren. Geben Sie beispielsweise einen neuen Entitätstyp ein, der einen "Bereich" darstellt. Wenn Sie ein Tutorium hinzufügen, erstellen Sie den entsprechenden "Bereich", falls noch nicht vorhanden, und beim Löschen eines Tutoral löschen Sie den entsprechenden "Bereich", wenn keine Tutorials mit demselben "Bereich" übrig sind. Wenn jeder Bereich eine Anzahl von Tutorials in diesem Bereich gespeichert hat, ist dies möglicherweise nicht allzu mühsam (obwohl die Einhaltung von Transaktionen usw. ziemlich umständlich ist). Ich erwarte, dass der Schlüssel der Entität auf der Bereichszeichenfolge selbst basieren kann, was bedeutet, dass Sie immer nach Schlüsselsuchen und nicht nach Abfragen zum Abrufen von Bereichsentitäten suchen können. Eine andere Option besteht darin, eine in der Warteschlange stehende Aufgabe oder einen Cron-Auftrag zu verwenden, um regelmäßig eine Liste aller Bereiche zu erstellen, sie bei Bedarf über mehrere Anfragen zu akkumulieren und die Ergebnisse entweder in den Datenspeicher oder in Memcache zu speichern. Das würde natürlich bedeuten, dass die Liste der Bereiche manchmal zeitweise nicht mehr aktuell ist (oder wenn es dauernde Änderungen gibt, könnte es nie ganz aktuell sein), was für Sie akzeptabel ist oder nicht.

Schließlich, wenn es wahrscheinlich sehr wenige Bereiche im Vergleich zu Tutorials gibt, könnten Sie es im laufenden Betrieb tun, indem Sie das erste Tutorial anfordern (sortiert nach Bereich) und dann das erste Tutorial anfordern, dessen Bereich größer ist als der Bereich der erste und so weiter. Dies erfordert jedoch eine Anfrage pro eindeutiges Gebiet, so dass es unwahrscheinlich ist, dass es schnell ist.

+0

Alles in Ordnung. Ich würde das "soweit ich weiß" -Bit persönlich entfernen. :) –

+0

Danke für deine Antwort. Ich denke, dass ich die Umstrukturierungsidee machen kann. Auch ich hatte gehofft, dass es einen obskuren Weg geben würde, der es schaffen könnte – AutomatedTester

0

This has been asked before, und die Schlussfolgerung war, dass die Verwendung von Sets in Ordnung ist.

+0

Die Frage war, wie man Python verwendet, um das Ergebnis zu filtern. Die Frage möchte hier den Fall berücksichtigen, in dem es 1001 oder mehr Tutorials gibt und daher eine einzelne Abfrage sie nicht zurückgeben kann. –

1

Das Schlüsselwort DISTINCT wurde in Release 1.7.4 eingeführt.

Verwandte Themen