2013-01-04 4 views
3

엔티티를 유지하고 데이터베이스가 키를 생성하도록 허용하고 있습니다. 불행하게도, 나는 API에서 합성 ID를 애타게 할 수없는 것 ... 여기 내가 뭘 내용은 다음과 같습니다Google 고유 식별자를 생성하지 않습니까?

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가 항상 0입니다! 세부 사항은 지속되지만 동일한 ID 필드로 여러 값이 유지됩니다. 싱긋 웃음을 보려면 여기를 객체 정의의 : GET 작업과 함께 다음

type Participant struct { 
    ID   int64 
    LastName string 
    FirstName string 
    Birthdate string 
    Email  string 
    Cell  string 
} 

, 나는 개체의 목록을 제시하고있다 (예, 내가 만든 엔티티, 내가 그들을 만든만큼) 모두의 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 값이 0 인 NewKey()도 사용했지만 동일한 결과를 얻었습니다. NewKey에 관한 API 문서는 (문자열) 이름과 ID가 불완전한 키를 생성하는 제로가된다는 것을 말합니다 - 문자열을 0으로 만드는 방법을 모르지만 nil이 작동하지 않습니다.

누군가는 문서의 올바른 부분을 가리키며 굉장히 분명한 것을 알아낼 수있게 도와줍니다.

답변

2

실제로 Put 전에 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

느린 타이핑을하는 날이 분명합니다. Jeremy 's가 더 완전한 대답입니다! –

5

어디서나 ID 입력란이 표시되지 않으므로 해당 입력란의 0 값이므로 0이됩니다. AppEngine은 구조체를 저장할 때 구조체를 수정하지 않습니다. 불완전한 키가 사용될 때 생성 된 IntId()가 struct에 넣을 때 새로 가져온 키가 반환됩니다. 나는 당신의 혼란이 문서가 결코 말하지 않은 것을 가정함으로써 야기되었다고 생각합니다. 즉, AppEngine은 저장된 데이터의 ID 필드를 자동으로 채 웁니다.

구조체의 ID 필드에 키에 사용 된 ID를 저장하려면 불완전한 키 대신 키를 만들 때 고유 한 고유 ID를 생성해야합니다.

문자열이 0 일 수 있다고 말하는 경우 빈 문자열 ""이 될 문자열 유형의 0 값을 나타냅니다. 여기에 0 값에 대한 자세한 내용을 볼 수 있습니다. http://golang.org/ref/spec#The_zero_value

+0

고마워요 ... 문제는 제가 Objective lib가 자동으로 ID를 최신 상태로 유지하는 Java 개발자 인 점이라고 생각합니다. Go가 DWIM을 구현할 것이라고 생각한 이유가 무엇인지 (즉, 내 뜻대로) . – PaulProgrammer

관련 문제