Question

I'm trying to put a *Key of a Location

type Location struct 
    City, State, Country string
}

in a Band

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

When I first create a Location, add the key, then try to retrieve the Location values, the strings all come out empty. If I then add a new Band, the location I created shows up fine, and using that location in a new Band works. I'm using incomplete keys:

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
}

Using an existing Location is as follows:

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

Using the key from the original Put didn't seem to work, so I resorted to:

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

And that didn't work right either. What am I not getting?

Was it helpful?

Solution

When you call datastore.Put with an incomplete key, the key's id is not filled in. The returned key has it. You're ignoring the return value from datastore.Put with _.

Your AddLocation func should look like this:

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
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top