2 回答
TA贡献1784条经验 获得超9个赞
您无法找到插入的实体,因为它保存的密钥与您尝试获取的密钥不同。
这一行:
_, err := datastore.Put(context, datastore.NewIncompleteKey(context, "Car", nil), car)
Car
使用新创建的、不完整的键保存实体。如果您尝试使用不完整的键保存实体,数据存储将为它分配一个(随机分布的)唯一数字 ID。甲数字ID,而不是一个string
name
。
然后您尝试使用具有以下内容的密钥来获取它string
name
:
carKey := datastore.NewKey(context, "Car", regnr, 0, nil)
他们永远不会匹配!实体键的标识符部分可以是
一键名字符串
或整数数字 ID
但不能两者兼而有之。所以当你保存一个实体时,它的键要么有一个string
名为name的ID要么(异或)一个int64
名为intID的ID 。
请阅读我关于实体标识符的回答:Can I use AllocateIDs as “string” ?
您的选择是:
I.regnr
作为字符串名称
无论是使用regnr
的string
name
,如果你确实有保证它是独特的,它总是存在(无实体保存没有regnr
):
carKey := datastore.NewKey(context, "Car", req.Regnr, 0, nil)
如果不是空字符串,则这不是不完整的键req.Regnr
,因此它将用作string
name
实体的键。这意味着稍后您可以通过以下方式获取此实体:
carKey := datastore.NewKey(context, "Car", regnr, 0, nil) err := datastore.Get(context, carKey, &car)
二、regnr
作为“正常”财产
或者定义regnr
为“普通”属性并使用不完整的键保存实体,将唯一的数字 ID 分配给系统。这不会限制您查找实体,regnr
因为如果它是索引属性,您可以通过它过滤实体。在这个替代方案regnr
中,不是实体键的一部分,因此您不能使用datastore.Get()
来获取实体,您必须使用查询,例如datastore.NewQuery()
.
比较:
I. 的优点是它更紧凑,使用更少的数据存储空间,通过regnr
.
I. 的缺点是您有责任保持regnr
唯一性,并且您无法保存Car
实体regnr
(这可能是也可能不是问题)。
TA贡献1831条经验 获得超4个赞
我注意到,如果我通过像这样插入 regnr 作为键来创建汽车:
car := &types.Car{ Model: req.Model, Regnr: req.Regnr, Year: req.Year, Type: req.Type, CreationTime: time.Now(), Sold: false, } //key := datastore.NewKey(context, "Car", "", 0, nil) carKey := datastore.NewKey(context, "Car", req.Regnr, 0, nil) _, err := datastore.Put(context, carKey, car)
我可以按照我在问题中写的那样找到它。但这是一个好的方法吗?如果有必要,我计划无论如何保持 regnr 的唯一性。
- 2 回答
- 0 关注
- 243 浏览
添加回答
举报