Wenn ich keinen Filter verwende, bekomme ich Ergebnisse. Wenn ich einen Filter verwende (dieser Datensatz existiert definitiv), bekomme ich keine Ergebnisse. Es könnte das Fehlen eines Index sein, der für diese Eigenschaft definiert ist, aber, wie ich es verstehe, sollten einfache Indizes auf dem Entwicklungsserver erstellt werden (und eine index.yaml-Datei erstellt und mit dieser gefüllt werden). Das passiert nicht.AppEngine Datastore Abfrage mit Filter gibt nie Ergebnisse (Go)
query = datastore.NewQuery("UserAccount").Filter("email =", "[email protected]")
ua := UserAccount{}
t := query.Run(ctx)
for ; ; {
if _, err = t.Next(&ua); err == nil {
log.Debugf(ctx, "Current: %s", ua)
} else if err == datastore.Done {
break
} else {
panic(err)
}
}
Wenn der Entwicklungs-Server beendet wird, heißt es, dass es „Speichern von Suchindizes“ ist:
INFO 2016-08-08 05:09:52,894 api_server.py:651] Saving search indexes
Da jedoch ein „index.yaml“ Datei nicht erscheint, gehe ich davon aus, dass es mussten keine Indizes erstellt werden, was bedeutet, dass meine Anfrage nicht die gewünschte Wirkung hatte?
Was fehlt mir?
Edit:
Beachten Sie, dass der Datensatz zuvor erstellt wurde und die Anwendung gestartet und gestoppt, da viele Male. Ich bezweifle ernsthaft, dass dies eine Konsequenz ist.
Edit 2:
Zum Zweck der Prüfung habe ich das folgende Modell mit dem folgenden Code erstellt. Beide zeigen das gleiche Verhalten wie mein ursprüngliches Modell und Code.
Definition:
type TestEntity struct {
Email string
}
Code:
log.Debugf(ctx, "Putting.")
email := "[email protected]"
te := &TestEntity{
Email: email,
}
k := datastore.NewKey(ctx, "TestEntity", "123", 0, nil)
_, err = datastore.Put(ctx, k, te)
if err != nil {
panic(err)
}
log.Debugf(ctx, "Waiting.")
time.Sleep(1 * time.Second)
query := datastore.NewQuery("TestEntity")
var results []TestEntity
_, err = query.GetAll(ctx, &results)
log.Debugf(ctx, "GetAll: %s", results)
log.Debugf(ctx, "Running query.")
query = datastore.NewQuery("TestEntity").Filter("email =", email)
te = &TestEntity{}
t := query.Run(ctx)
for ; ; {
if _, err = t.Next(te); err == nil {
log.Debugf(ctx, "Found: [%s]", te.Email)
} else if err == datastore.Done {
log.Debugf(ctx, "Done.")
break
} else {
panic(err)
}
}
Ergebnisse:
2016/08/09 02:11:36 DEBUG: Putting.
2016/08/09 02:11:36 DEBUG: Waiting.
2016/08/09 02:11:37 DEBUG: GetAll: [{[email protected]}]
2016/08/09 02:11:37 DEBUG: Running query.
2016/08/09 02:11:37 DEBUG: Done.
Screenshot von Viewer:
Es ist wegen ** eventueller Konsistenz **. Siehe mögliche Duplikate: 1. [Wie filtere ich eine GAE-Abfrage?] (Http://stackoverflow.com/questions/29228712/how-to-filter-a-gae-query); 2. [Google App Engine-Datenspeicher - Testing Queries schlägt fehl] (http://stackoverflow.com/questions/28590519/google-app-engine-datastore-testing-queries-fails); 3. [Warum liefert die Abfrage keine Ergebnisse, wenn der Vorgänger nicht bereitgestellt wird?] (Http://stackoverflow.com/questions/29529296/why-the-query-doesn-return-results-when-the-ancestor- is-not-provided) – icza
Bitte bestätigen Sie, wenn dies Ihr Problem löst. – icza
@icza Es tut es nicht. Der Datensatz existierte vorher (gelesen: bevor der aktuelle Entwicklungsserver gestartet wurde). Es wurde nicht nur erstellt. –