2009-02-28 1 views
22

Ich habe eine neue Eigenschaft für mein db-Modell im Google App Engine-Datenspeicher erstellt.AppEngine: Abfrage des Datenspeichers für Datensätze mit <missing> Wert

Alt:

class Logo(db.Model): 
    name = db.StringProperty() 
    image = db.BlobProperty() 

Neu:

class Logo(db.Model): 
    name = db.StringProperty() 
    image = db.BlobProperty() 
    is_approved = db.BooleanProperty(default=False) 

Wie für die Logo Datensätze abfragen, die nicht zu haben, die 'is_approved' eingestellt? Ich versuchte

logos.filter("is_approved = ", None) 

aber es hat nicht funktioniert. Im Data Viewer werden die neuen Feldwerte als angezeigt.

Antwort

33

Nach der App Engine-Dokumentation auf Queries and Indexes, gibt es eine Unterscheidung zwischen Gesellschaften, die keinen Wert für eine Eigenschaft haben, und diejenigen, die einen null Wert für sie haben; und "Entitäten ohne eine gefilterte Eigenschaft werden nie von einer Abfrage zurückgegeben." Daher ist es nicht möglich, eine Abfrage für diese alten Datensätze zu schreiben.

Ein nützlicher Artikel ist Updating Your Model's Schema, der besagt, dass die einzige derzeit unterstützte Möglichkeit, Entitäten zu finden, denen eine Eigenschaft fehlt, darin besteht, alle zu untersuchen. Der Artikel enthält Beispielcode, der zeigt, wie Sie durch eine große Menge von Elementen blättern und sie aktualisieren können.

+4

Marzia von Google hat bestätigt, dass es keine Möglichkeit gibt, fehlende Werte abzufragen. – gravitation

2

Vielleicht hat sich das geändert, aber ich bin in der Lage, Datensätze basierend auf null Felder zu filtern.

Wenn ich die GQL-Abfrage SELECT * FROM Contact WHERE demo=NULL versuche, gibt es nur Datensätze zurück, für die das Demofeld fehlt.

Nach dem doc http://code.google.com/appengine/docs/python/datastore/gqlreference.html:

Die rechte Seite eines Vergleichs kann eine der folgenden (für die Eigenschaft Datentyp als angemessen) sein: [...] eine Boolesche wörtliche, als WAHR oder FALSCH; das NULL Literal, das den Nullwert darstellt (Keine in Python).

Ich bin nicht sicher, dass „null“ das gleiche ist wie „fehlende“ aber: in meinem Fall, diese Felder gab es schon in meinem Modell, sondern wurden auf Schöpfung nicht besiedelt. Vielleicht könntest du Federico wissen lassen, ob die NULL-Abfrage in deinem speziellen Fall funktioniert?

+2

Das Feld fehlte nicht, wenn es zu dem Zeitpunkt, als die Entität erstellt wurde, Teil Ihres Modells war. Und es wurde bei der Erstellung ausgefüllt, auch wenn es mit 'None' oder der leeren Zeichenfolge gefüllt wurde. – geoffspear

+1

Null ist Null,! = Fehlt. Es nimmt tatsächlich Speicherplatz sowohl im Datenspeicher als auch in den Indizes ein. – ZiglioUK

Verwandte Themen