【发布时间】:2016-08-08 12:38:58
【问题描述】:
如果我不使用过滤器,我会得到结果。如果我使用过滤器(这条记录肯定存在),我不会得到任何结果。可能是缺少为该属性定义的索引,但据我了解,应该在开发服务器中自动创建简单的索引(并创建一个 index.yaml 文件并用它填充)。这不会发生。
query = datastore.NewQuery("UserAccount").Filter("email =", "test@example.com")
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 := "anothertest@a.b"
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: [{anothertest@a.b}]
2016/08/09 02:11:37 DEBUG: Running query.
2016/08/09 02:11:37 DEBUG: Done.
查看器的屏幕截图:
【问题讨论】:
-
请确认这是否解决了您的问题。
-
@icza 它没有。该记录以前存在(阅读:在当前开发服务器启动之前)。它不仅仅是创建的。
-
你确定你有一个精确的
UserAccount实体,其"email"属性具有"test@example.com"?请在这个可能的重复项上检查我的答案,并确认所有测试是否通过:How do I query an appengine datastore with an email address -
@icza 有几个优点,但没有一个适用。我用具有不同价值的不同记录进行了验证。这太荒谬了。
标签: google-app-engine go google-cloud-datastore