2013-01-04 86 views
3

我試圖堅持實體,並允許數據庫生成密鑰。不幸的是,我似乎無法逗合成的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都是零創建一個不完整的鍵 - 我不知道如何使字符串爲零,但零不起作用。

有人幫我弄清楚什麼是可能令人驚訝的明顯就曾指出到文檔中的正確位置。

回答

2

我沒有看到你真正改變ID之前的認沽的價值?據我所知,它總是將是0。我沒有料想到會看到這樣的:

// PERSIST! 
putKey, e := datastore.Put(c, key, participant) 
if e != nil { 
    // ... 
} 
// ... 
participant.ID = putKey.IntID() 
putKey, e = datastore.Put(c, putKey, participant) 

沒有測試,但你得到的圖片...否則ID將始終爲0

+0

顯然這是我打字慢的一天。傑里米的回答更完整! –

5

我沒有看到你填充ID字段任何地方,當然這將是0,因爲這是該字段的值爲零。 AppEngine在存儲它時不會修改你的結構。當你使用一個不完整的鍵的時候,當你放置結構體時,新創建的鍵包含生成的IntId()。我認爲你的錯誤是由於假定文檔從未說過的話而造成的。即AppEngine會爲您自動填充存儲數據中的ID字段。

因爲你的情況,你想要的結構的ID字段來存儲你可能要產生你當你創建一個密鑰,而不是使用不完整的密鑰自己獨特的ID的密鑰使用的ID。

當醫生說一個字符串可以是零它指的是一個字符串類型這將空字符串「」的零值。您可以在此處詳細瞭解零值:http://golang.org/ref/spec#The_zero_value

+0

謝謝...我認爲這個問題是,我主要是Java開發,其中物化的lib自動保持IDS最新...由於某種原因,我認爲圍棋也將實現DWIM(做什麼我的意思) 。 – PaulProgrammer