我試圖堅持實體,並允許數據庫生成密鑰。不幸的是,我似乎無法逗合成的ID了API的...以下是我在做什麼:Google Go不生成唯一標識符?
case "POST":
d,_ := ioutil.ReadAll(r.Body)
participant := new(Participant)
err := json.Unmarshal(d, &participant)
if err != nil {
serveError(c, w, err)
return
}
var key *datastore.Key;
if participant.ID == 0 {
// no id yet .. create an incomplete key and allow the db to create one.
key = datastore.NewIncompleteKey(c, "participant", parentKey)
} else {
// we have an id. use that to update
key = datastore.NewKey(c, "participant", "", participant.ID, parentKey)
}
// PERSIST!
putKey, e := datastore.Put(c, key, participant)
if e != nil {
serveError(c, w, e)
return
}
// Fetch back out of the database, presumably with my new ID
if e = datastore.Get(c, putKey, participant); e != nil {
serveError(c, w, e)
return
}
// send to the consumer
json,_ := json.Marshal(participant)
w.Write(json)
好了,奇怪的是ID始終爲零!細節仍然存在,但是我獲得了多個值,這些值與相同的ID字段保持一致。對於咧嘴一笑,這裏的對象定義:
type Participant struct {
ID int64
LastName string
FirstName string
Birthdate string
Email string
Cell string
}
用GET操作的後續行動,我提出了實體的列表(是的,我創建的實體,因爲我創造了他們很多次)所有的ID零。
[
{"ID":0,"LastName":"Schmuck","FirstName":"Joe","Birthdate":"12-12-12","Email":"","Cell":""},
{"ID":0,"LastName":"Schmuck","FirstName":"Jane","Birthdate":"12-12-12","Email":"","Cell":""},
{"ID":0,"LastName":"Schmuck","FirstName":"Jane","Birthdate":"12-12-12","Email":"","Cell":""},
{"ID":0,"LastName":"Schmuck","FirstName":"Jane","Birthdate":"12-12-12","Email":"","Cell":""},
{"ID":0,"LastName":"Schmuck","FirstName":"Jane","Birthdate":"12-12-12","Email":"","Cell":""},
{"ID":0,"LastName":"Schmuck","FirstName":"Jane","Birthdate":"12-12-12","Email":"","Cell":""}
]
爲了完整性,我也嘗試使用ID值爲零的NewKey(),但是得到了相同的結果。有關NewKey的API文檔中提到了一些關於(字符串)名稱和ID都是零創建一個不完整的鍵 - 我不知道如何使字符串爲零,但零不起作用。
有人幫我弄清楚什麼是可能令人驚訝的明顯就曾指出到文檔中的正確位置。
顯然這是我打字慢的一天。傑里米的回答更完整! –