Pau*_*mer 3 google-app-engine go google-cloud-datastore
我正在尝试持久化实体,并允许数据库生成密钥.不幸的是,我似乎无法从API中取出合成ID ...这就是我正在做的事情:
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)
Run Code Online (Sandbox Code Playgroud)
好吧,奇怪的是,ID始终为零!详细信息会保留,但我会使用相同的ID字段保留多个值.对于grins,这是对象定义:
type Participant struct {
ID int64
LastName string
FirstName string
Birthdate string
Email string
Cell string
}
Run Code Online (Sandbox Code Playgroud)
跟进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":""}
]
Run Code Online (Sandbox Code Playgroud)
为了完整起见,我还尝试使用ID值为零的NewKey(),但这给出了相同的结果.关于NewKey的API文档说了一些关于(字符串)名称和ID都是零创建一个不完整的键 - 我不知道如何使字符串为零,但是nil不起作用.
有人帮我弄清楚一旦指向文档的正确部分可能会非常明显.
我没有看到你在任何地方填充ID字段,所以当然它将是0,因为那是该字段的零值.AppEngine在存储时不会修改结构.当您使用不完整的键时,在放置struct时返回的新创建的键包含生成的IntId().我认为你的困惑是由于假设文档从未说过而引起的.即,AppEngine会为您自动填充存储数据中的ID字段.
因为在您的情况下,您希望结构的ID字段存储您在密钥中使用的ID,您可能希望在创建密钥时使用自己的唯一ID,而不是使用不完整的密钥.
当doc说一个字符串可以为零时,它指的是字符串类型的零值,这将是空字符串"".您可以在此处阅读有关零值的更多信息:http://golang.org/ref/spec#The_zero_value
| 归档时间: |
|
| 查看次数: |
919 次 |
| 最近记录: |