代码之家  ›  专栏  ›  技术社区  ›  Srinath Reddy

无法使用golang从数据存储中获取基于结构值的记录

  •  2
  • Srinath Reddy  · 技术社区  · 7 年前

    我正在为搜索功能编写服务。当我在正文中传递值以获取特定记录时,我无法基于struct值获取它。 例如:电话号码或用户名

    编辑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"     
    }
    

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

    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,并且基于这个keyname我不想得到值。

    1 回复  |  直到 7 年前
        1
  •  1
  •   icza    7 年前

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

    这显然不是你想要做的。您正在尝试按非键的属性提取实体。要做到这一点,您需要运行 查询 .

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

    这就是它的样子。获取按电话筛选的患者实体:

    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
    

    获取按电话号码和用户名筛选的患者的示例:

    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