1 回答

TA貢獻2036條經(jīng)驗 獲得超8個贊
datastore.GetAll()不會將結果返回給您,因為該查詢最終一致性適用。SDK 模擬最終一致性,不會立即返回新保存的實體。
但是在您TestCreateUser()使用的方法中datastore.Get(),即使實體是新保存的(“剛剛”),它也會返回給您,因為它是通過鍵查找,并且它們是高度一致的。
幕后發(fā)生的事情是,當您調用 時datastore.Put(),實體數(shù)據(jù)(屬性的值)被保存,其鍵被索引,然后datastore.Put()返回,其他屬性的索引和復合索引在“后臺”異步更新。因此,如果您嘗試執(zhí)行使用索引來查找/列出實體的查詢(您通過Email屬性查詢),則該查詢將不會看到(不會包括)新實體,直到它們被正確索引。當您執(zhí)行 a 時datastore.Get(),它通過鍵而不是其他(非鍵屬性或復合)索引加載實體,因此通過鍵獲取實體將“立即”(datastore.Put()返回后)看到新實體。
如果您想在本地環(huán)境中對此進行測試,您可以StronglyConsistentDatastore在創(chuàng)建將用于創(chuàng)建新上下文的實例時提供選項,如下所示:
inst, err := aetest.NewInstance(&aetest.Options{StronglyConsistentDatastore: true})
if err != nil {
t.Fatalf("Failed to create instance: %v", err)
}
defer inst.Close()
req, err := inst.NewRequest("GET", "/", nil)
if err != nil {
t.Fatalf("Failed to create req: %v", err)
}
ctx := appengine.NewContext(req)
另請注意,如果您使用 sleep(例如time.Sleep(time.Millisecond * 500)),datastore.GetAll()也將返回新實體,但上述選項是測試這一點的正確方法。
- 1 回答
- 0 關注
- 194 瀏覽
添加回答
舉報