google-app-engine - 带过滤器的 AppEngine 数据存储区查询从不返回结果 (Go)

标签 google-app-engine go google-cloud-datastore

如果我不使用过滤器,我会得到结果。如果我使用过滤器(这条记录肯定存在),我不会得到任何结果。可能是缺少为该属性定义的索引,但据我了解,应该在开发服务器中自动创建简单的索引(并创建一个 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.

查看器的屏幕截图:

Screenshot of Viewer

最佳答案

数据存储中的属性名称是 "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/

相关文章:

google-app-engine - 加载作业失败,错误字段 {field-name} 已存在于架构中

python - GAE、oauth2 和管理员用户

python - NoneType 没有属性 Append

go - 如何使用 fyne 避免 GUI 应用程序中的循环依赖?

google-app-engine - 使用 GetMulti 列出单一数据存储类型的所有实体

java - 配置 ReSTLet 以在 Google App Engine 上返回 JSP?

go - 如何从 Go 程序中的另一个文件导入定义?

java - GAE/J 范围查询中最大可能的键字符串是什么?

java - 创建 java Query 对象时转义字符串文字 "by"、sql 保留字

arrays - 如何在 Go 中混合使用十六进制和字符串创建字节数组?