首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从使用golang的数据存储中获取基于struct值的记录

问无法从使用golang的数据存储中获取基于struct值的记录
EN

Stack Overflow用户
提问于 2017-12-19 09:29:38
回答 1查看 252关注 0票数 2

我正在为搜索功能编写一个服务。当我在正文中传递值以获得特定的记录时,我无法根据结构值获得它。例:电话号码或用户名

Edit1:

代码语言:javascript
复制
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"     
}

我想得到完整的基于用户名或电话的结构值。下面是我的代码:

代码语言:javascript
复制
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中传递电话时,我无法根据电话生成值。

我不想在put功能中使用Newkey来生成密钥名,基于这个keyname,我不想获得值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-19 12:05:32

datastore.Get()只能通过其密钥从数据存储中获取实体,因此它的密钥必须是已知的/存在的。

这显然不是你想要做的。您正在尝试通过不是键的属性来获取实体。为此,您需要运行一个查询。

数据存储查询由datastore.Query类型表示。您需要创建一个查询并在其上设置过滤器。在您的示例中,您希望通过用户名和/或电话属性进行筛选。

这就是它的样子。获取通过电话过滤的病人实体:

代码语言:javascript
复制
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

一个通过电话号码和用户名筛选病人的示例:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47883783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档