无法使用golang从数据存储中获取基于结构值的记录
Unable to get the record based on struct value from datastore using golang
我正在为搜索功能编写服务。当我在正文中传递值以获取特定记录时,我无法根据结构值获取它。
ex:phone 号码或用户名
编辑1:
type PatientData struct {
ID int64 datastore:"-"
FirstName string json:"firstname,omitempty"
LastName string json:"lastname,omitempty"
UserName string json:"username,omitempty"
Phone string json:"phone,omitempty"
}
我想根据用户名或 Phone 获取完整的结构值。下面是我的代码:
func searchValue (res http.ResponseWriter, req *http.Request){
log.Printf("%#v Getting values url - x ", "called search")
patient := &PatientData{}
if err := json.NewDecoder(req.Body).Decode(patient); err != nil {
panic(err)
}
ctx := appengine.NewContext(req)
ctx, err := appengine.Namespace(ctx, NAMESPACENAME)
if err != nil {
panic(err)
}
m := patient.Phone
i, err := strconv.ParseInt(m, 10, 64)
log.Printf("%#v Getting values m ", m)
log.Printf("%#v Getting values url -yyy ",i)
key := datastore.NewKey(ctx, "Patient","" , i, nil)
log.Printf("%#v Getting values url - key ", key)
err = datastore.Get(ctx, key, patient)
if err := json.NewEncoder(res).Encode(patient); err != nil {
panic(err)
}
}
因为我在我的 Newkey 中传递 PHONE,所以我无法生成基于 PHONE
的值
我不想使用 Newkey in put 功能生成键名,并且我不想基于该 KEYNAME 获取值。
datastore.Get()
只能用于通过其键从数据存储中获取实体,因此其键必须已知/存在。
这显然不是您想要做的。您正在尝试通过不是键的属性获取实体。为此,您需要 运行 一个 查询 .
数据存储区查询由 datastore.Query
类型表示。您需要创建一个查询并为其设置过滤器。在您的情况下,您想按用户名 and/or phone 属性进行过滤。
这就是它的样子。获取按 phone:
筛选的患者实体
q := datastore.NewQuery("Patient").Filter("phone =", patient.Phone)
var patients []*Patient
keys, err := q.GetAll(ctx, &patients)
if err != nil {
// Handle error
return
}
// patients contains patients with the given phone number
获取按 phone 号码和用户名过滤的患者的示例:
q := datastore.NewQuery("Patient").
Filter("phone =", patient.Phone).
Filter("username =", patient.UserName)
var patients []*Patient
keys, err := q.GetAll(ctx, &patients)
if err != nil {
// Handle error
return
}
// patients contains patients with the given phone number and username
我正在为搜索功能编写服务。当我在正文中传递值以获取特定记录时,我无法根据结构值获取它。 ex:phone 号码或用户名
编辑1:
type PatientData struct {
ID int64 datastore:"-"
FirstName string json:"firstname,omitempty"
LastName string json:"lastname,omitempty"
UserName string json:"username,omitempty"
Phone string json:"phone,omitempty"
}
我想根据用户名或 Phone 获取完整的结构值。下面是我的代码:
func searchValue (res http.ResponseWriter, req *http.Request){
log.Printf("%#v Getting values url - x ", "called search")
patient := &PatientData{}
if err := json.NewDecoder(req.Body).Decode(patient); err != nil {
panic(err)
}
ctx := appengine.NewContext(req)
ctx, err := appengine.Namespace(ctx, NAMESPACENAME)
if err != nil {
panic(err)
}
m := patient.Phone
i, err := strconv.ParseInt(m, 10, 64)
log.Printf("%#v Getting values m ", m)
log.Printf("%#v Getting values url -yyy ",i)
key := datastore.NewKey(ctx, "Patient","" , i, nil)
log.Printf("%#v Getting values url - key ", key)
err = datastore.Get(ctx, key, patient)
if err := json.NewEncoder(res).Encode(patient); err != nil {
panic(err)
}
}
因为我在我的 Newkey 中传递 PHONE,所以我无法生成基于 PHONE
的值我不想使用 Newkey in put 功能生成键名,并且我不想基于该 KEYNAME 获取值。
datastore.Get()
只能用于通过其键从数据存储中获取实体,因此其键必须已知/存在。
这显然不是您想要做的。您正在尝试通过不是键的属性获取实体。为此,您需要 运行 一个 查询 .
数据存储区查询由 datastore.Query
类型表示。您需要创建一个查询并为其设置过滤器。在您的情况下,您想按用户名 and/or phone 属性进行过滤。
这就是它的样子。获取按 phone:
筛选的患者实体q := datastore.NewQuery("Patient").Filter("phone =", patient.Phone)
var patients []*Patient
keys, err := q.GetAll(ctx, &patients)
if err != nil {
// Handle error
return
}
// patients contains patients with the given phone number
获取按 phone 号码和用户名过滤的患者的示例:
q := datastore.NewQuery("Patient").
Filter("phone =", patient.Phone).
Filter("username =", patient.UserName)
var patients []*Patient
keys, err := q.GetAll(ctx, &patients)
if err != nil {
// Handle error
return
}
// patients contains patients with the given phone number and username