为了账号安全,请及时绑定邮箱和手机立即绑定

golang 数据存储获取对象

golang 数据存储获取对象

Go
GCT1015 2021-12-06 16:51:01
我需要一些指导,我这样做是否正确。我正在尝试获取汽车的单个对象。这就是我创建汽车的方式: 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)        _, err := datastore.Put(context, datastore.NewIncompleteKey(context, "Car", nil), car)这是我试图再次获得汽车的方式。vars := mux.Vars(r)        regnr := vars["regnr"]        car := types.Car{}        carKey := datastore.NewKey(context, "Car", regnr, 0, nil)        err := datastore.Get(context, carKey, &car)        if err != nil {            log.Println("error getting car", err)            w.WriteHeader(http.StatusInternalServerError)            return        }但我收到错误:“获取汽车数据存储时出错:没有这样的实体”我知道我可以做一个 GetAll 并限制为一个。但是如果我删除一个对象,我需要实体。我猜。所以我想把它做对。
查看完整描述

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作为字符串名称

无论是使用regnrstring 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(这可能是也可能不是问题)。


查看完整回答
反对 回复 2021-12-06
?
慕容708150

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 的唯一性。


查看完整回答
反对 回复 2021-12-06
  • 2 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信