如果我不使用過濾器,我會得到結果。如果我使用過濾器(這個記錄肯定存在),我沒有得到任何結果。可能缺少爲該屬性定義的索引,但據我所知,應該在開發服務器中自動創建簡單索引(並創建並填充index.yaml文件)。這沒有發生。帶過濾器的AppEngine數據存儲查詢從不返回結果(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)
}
}
當開發服務器終止,它說,它的「節省搜索索引」:
INFO 2016-08-08 05:09:52,894 api_server.py:651] Saving search indexes
然而,由於「index.yaml中」文件未出現,我假設沒有索引需要創建,這意味着我的查詢一定沒有達到預期的效果?
我錯過了什麼?
編輯:
注意記錄之前創建和應用程序停止並開始以來多次。我真誠地懷疑這是一個最終一致的東西。
編輯2:
出於測試目的,我創建了下面的代碼下面的模型。它們都表現出與我原來的模型和代碼相同的行爲。
定義:
type TestEntity struct {
Email string
}
代碼:
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)
}
}
結果:
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.
瀏覽器的截圖:
這是因爲**最終一致性**。查看可能的重複項:1. [如何篩選GAE查詢?](http://stackoverflow.com/questions/29228712/how-to-filter-a-gae-query); 2. [Google App Engine數據存儲 - 測試查詢失敗](http://stackoverflow.com/questions/28590519/google-app-engine-datastore-testing-queries-fails); 3. [爲什麼查詢在沒有提供祖先時沒有返回結果?](http://stackoverflow.com/questions/29529296/why-the-query-doesnt-return-results-when-the-ancestor-未提供) – icza
請確認這是否解決了您的問題。 – icza
@icza它沒有。以前存在的記錄(讀取:在當前開發服務器啓動之前)。它不僅僅是被創造出來的。 –