猿问

golang 数据存储获取对象

我需要一些指导,我这样做是否正确。我正在尝试获取汽车的单个对象。这就是我创建汽车的方式:


 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 并限制为一个。但是如果我删除一个对象,我需要实体。我猜。所以我想把它做对。


GCT1015
浏览 244回答 2
2回答

千万里不及你

您无法找到插入的实体,因为它保存的密钥与您尝试获取的密钥不同。这一行:_, 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(这可能是也可能不是问题)。

慕容708150

我注意到,如果我通过像这样插入 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 的唯一性。
随时随地看视频慕课网APP

相关分类

Go
我要回答