如何使用Go将密钥存储在数据存储区对象中?

时间:2014-05-06 16:56:39

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

我试图输入位置的*键

type Location struct 
    City, State, Country string
}

在乐队中

type Band struct {
    Name string
    LocationId *datastore.Key
    Albums []Album
}

当我第一次创建位置时,添加键,然后尝试检索位置值,这些字符串都是空的。如果我然后添加一个新的Band,我创建的位置显示正常,并在新Band中使用该位置。我使用了不完整的密钥:

func AddLocation(value Location, rq *http.Request) (*datastore.Key, error) {
    c := appengine.NewContext(rq)
    key := datastore.NewIncompleteKey(c, config.LOCATION_TYPE, nil)
    _, err := datastore.Put(c, key, &value)

    return key, err
}

使用现有位置如下:

case "existing":
    rawId := rq.FormValue("location_id")
    q := strings.Split(rawId, ",")
    x := q[1]
    id_int, e := strconv.ParseInt(x, 10, 64)
    if e != nil {
        message = e.Error()
    }
    locationId = datastore.NewKey(c, config.LOCATION_TYPE, "", id_int, nil)
    //  message = "not implemented yet"
    break

使用原始Put中的密钥似乎不起作用,所以我使用了:

case "new":
    location := model.Location{rq.FormValue("city"), rq.FormValue("state"), rq.FormValue("country")}
    var err error
    _, err = model.AddLocation(location, rq)
    if err != nil {
        message = "Location add: " + err.Error()
    }
    q := datastore.NewQuery(config.LOCATION_TYPE).Filter("City =", location.City).
        Filter("State =", location.State).Filter("Country =", location.Country).
        KeysOnly()
    keys, err := q.GetAll(c, nil)
    if err != nil {
    message = "Location add: " + err.Error()
    }
    var k *datastore.Key
    for _, key := range keys {
        k = key
        break
    }
    locationId = k
    break

那也不行。我得不到什么?

1 个答案:

答案 0 :(得分:1)

当您使用不完整的密钥呼叫datastore.Put时,密钥的ID未填写。返回的密钥具有该密钥。您使用_忽略datastore.Put的返回值。

您的AddLocation func应如下所示:

func AddLocation(value Location, rq *http.Request) (*datastore.Key, error) {
    c := appengine.NewContext(rq)
    key := datastore.NewIncompleteKey(c, config.LOCATION_TYPE, nil)
    // this line updates the key with accurate information
    key, err := datastore.Put(c, key, &value)

    return key, err
}