如果我不使用过滤器,我会得到结果。如果我使用过滤器(这条记录肯定存在),我不会得到任何结果。可能是缺少为该属性定义的索引,但据我了解,应该在开发服务器中自动创建简单的索引(并创建一个 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.
查看器的屏幕截图:
最佳答案
数据存储中的属性名称是 "Email"
大写 E,而不是 "email"
。
区分大小写,必须用大写E查询:
query = datastore.NewQuery("UserAccount").Filter("Email =", "test@example.com")
如果您希望使用小的e
保存/检索它,您可以使用tags。做映射,例如:
type UserAccount struct {
Email string `datastore:"email"`
// other fields...
}
关于google-app-engine - 带过滤器的 AppEngine 数据存储区查询从不返回结果 (Go),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38829469/