1 回答

TA贡献2036条经验 获得超8个赞
datastore.GetAll()不会将结果返回给您,因为该查询最终一致性适用。SDK 模拟最终一致性,不会立即返回新保存的实体。
但是在您TestCreateUser()使用的方法中datastore.Get(),即使实体是新保存的(“刚刚”),它也会返回给您,因为它是通过键查找,并且它们是高度一致的。
幕后发生的事情是,当您调用 时datastore.Put(),实体数据(属性的值)被保存,其键被索引,然后datastore.Put()返回,其他属性的索引和复合索引在“后台”异步更新。因此,如果您尝试执行使用索引来查找/列出实体的查询(您通过Email属性查询),则该查询将不会看到(不会包括)新实体,直到它们被正确索引。当您执行 a 时datastore.Get(),它通过键而不是其他(非键属性或复合)索引加载实体,因此通过键获取实体将“立即”(datastore.Put()返回后)看到新实体。
如果您想在本地环境中对此进行测试,您可以StronglyConsistentDatastore在创建将用于创建新上下文的实例时提供选项,如下所示:
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 关注
- 198 浏览
添加回答
举报