【问题标题】:How do I query an appengine datastore with an email address如何使用电子邮件地址查询 appengine 数据存储
【发布时间】:2015-03-18 21:29:55
【问题描述】:

我正在尝试使用他们的电子邮件地址在 appengine 数据存储中查找用户。我正在使用 Go。

此代码找不到用户。

var users []entity.User
q := datastore.NewQuery("users").Filter("AccountEmail =", "email@address.com")
_, err := q.GetAll(c, &users)

如果我更改查询以使用“Id”属性查找用户,则它可以正常工作。

var users []entity.User
q := datastore.NewQuery("users").Filter("Id", "185804764220139124118")
_, err := q.GetAll(c, &users)

我已确认“AccountEmail”的属性名称和值是正确的。 "AccountEmail" 也被索引了。

是否需要对电子邮件地址进行一些特殊的格式化才能使查询正常工作?

【问题讨论】:

  • 电子邮件地址不需要特殊格式。字符串是字符串。显示您的实体类型声明。使用数据存储查看器确认具有给定属性的实体存在。
  • 它是存储为字符串还是字节切片之类的其他东西?
  • @fredrik - “AccountEmail”存储为字符串。
  • @Thundercat - 我已在数据存储查看器中确认“用户”实体确实存在并且属性名称“AccountEmail”存在。
  • 你确定没有空格什么的吗?如果你通过 id 获取fmt.Printf("%#v", users),你会得到什么输出?

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


【解决方案1】:

要通过电子邮件 (AccountEmail) 找到用户,必须满足以下所有条件。请检查并确保每个“测试”通过:

  • 属性名称为AccountEmail 的实体必须存在。不要忘记属性名称区分大小写。注意数据存储名称和struct字段名称可能不同,可以使用标签来更改,例如

    AccountEmail string `datastore:"email"`

  • 该属性必须被索引。请注意,是否对属性进行索引可能因实体而异,因此您可能有一个实体,其中 AccountEmail 已编入索引,而另一个实体未编入AccountEmail

  • AccountEmail 必须具有 string 类型。我认为这是微不足道的。但请注意,可以使用不同于 string 类型的 User 类型保存属性,例如,当您在 Datastore 查看器中列出实体时,电子邮件将像电子邮件一样显示字符串,但显然是不同的。

  • 要找到AccountEmail="email@address.com" 的用户,保存的值必须是"email@address.com"。大小写字母不一样!空格(和所有空白字符)很重要!请检查保存的值是否正是这个,例如打印时您不会看到尾随空格,但它们会导致不匹配!还有一些 unicode 字符具有相同的视觉外观(它们看起来相同),但它们的 unicode 代码点不一样,也会导致不匹配。

【讨论】:

  • 你的最后一点在我的情况下是正确的。数据来自一个 url 参数,并且 url 中有一个轻微的拼写错误,这导致了我在视觉上看不到的差异。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2019-04-28
  • 2015-10-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多