Google app engine 如何从数据存储中获取ID以更新实体?

Google app engine 如何从数据存储中获取ID以更新实体?,google-app-engine,go,google-cloud-datastore,Google App Engine,Go,Google Cloud Datastore,我正在构建一个RESTAPI来执行CRUD操作 我有一个Go结构: type VisitEntiry struct { FirstName string `json:"firstname"` LastName string `json:"lastname"` UserName string `json:"username"` PassWord string `json:"password"` Email string `json:"email"` } 我

我正在构建一个RESTAPI来执行CRUD操作

我有一个Go结构:

type VisitEntiry struct {
    FirstName string `json:"firstname"`
    LastName string `json:"lastname"`
    UserName string `json:"username"`
    PassWord string `json:"password"`
    Email string `json:"email"`
}
我能够在数据存储中保存和检索访问区。所以我需要编辑访问实体,我想得到数据存储分配给访问权限使用的ID。我验证了ID是使用Google的数据存储仪表板分配的,但是如何从检索到的VisitEntiry中获取ID呢

云你请帮我写代码来编辑实体

import (
    "encoding/json"
    "log"
    "net/http"
    "golang.org/x/net/context"
    "google.golang.org/appengine"
    "google.golang.org/appengine/datastore"
)

const KINDNAME = "Vist"

const NAMESPACENAME = "-Test-"

type VisitEntiry struct {
    FirstName string `json:"firstname"`
    LastName string `json:"lastname"`
    UserName string `json:"username"`
    PassWord string `json:"password"`
    Email string `json:"email"`
}
var visit *VisitEntiry
//SuccessResponse store response
type SuccessResponse struct {
    //  visit VisitEntiry `json:"entity"`
    ID int64 `json:"Id"`
    Message string `json:"message"`
}
func init() {
    http.HandleFunc("/api/getallvisits", restHandler)
    http.HandleFunc("/api/postavisit", restHandler)
}
func restHandler(w http.ResponseWriter, r *http.Request) {
    var v VisitEntiry
    _ = json.NewDecoder(r.Body).Decode(&v)
    json.NewEncoder(w).Encode(v)
    visit = &VisitEntiry{
        FirstName: v.FirstName,
        LastName: v.LastName,
        UserName: v.UserName,
        PassWord: v.PassWord,
        Email: v.Email,
    }
    switch r.Method {
    case "GET":
        getallvisitshandler(w, r)
        return
    case "POST":
        putavisthandler(w, r)
        return
    case "DELETE":
        //  handleDelete(ed, w, r)
        return
    default:
        //respondErr(w, r, http.StatusNotFound, "is not supported HTTP methods")
    }
}
func respond(w http.ResponseWriter, r *http.Request, status int, data interface{}) {
    w.WriteHeader(status)
    if data != nil {
        json.NewEncoder(w).Encode(data)
    }
}
func getallvisitshandler(w http.ResponseWriter, r *http.Request) {

    var visitslist []VisitEntiry
    var ctx context.Context
    ctx = appengine.NewContext(r)
    ctx, err := appengine.Namespace(ctx, NAMESPACENAME)
    if err != nil {
        return
    }
    q := datastore.NewQuery(KINDNAME)
    _, err = q.GetAll(ctx, &visitslist)
    json.NewEncoder(w).Encode(visitslist)
    //log.Printf("%#v Getting values From Datastore - visits ", visitskeys)
}
func putavisthandler(w http.ResponseWriter, r *http.Request) {
    var ctx context.Context
    keys := make([]*datastore.Key, 1)
    ctx = appengine.NewContext(r)
    ctx, err := appengine.Namespace(ctx, NAMESPACENAME)
    if err != nil {
        return
    }
    keys[0] = datastore.NewIncompleteKey(ctx, KINDNAME, nil)
    visitentity, err := datastore.Put(ctx, keys[0], visit)
    ID := visitentity.IntID()
    value := visitentity.Encode()
    //value : = visitentity.Encode()
    log.Printf("%#v Getting values From Datastore - visits ", value)
    respond(w, r, http.StatusOK, SuccessResponse{ID, "Visit Entity Inserted Successfully! "})
}
在保存时获取实体的密钥 当您将一个新实体放入数据存储(例如,使用函数)时,您将得到分配的密钥作为回报:

func Put(c context.Context, key *Key, src interface{}) (*Key, error)
更新现有实体 要更新数据存储中的现有实体,首先需要从数据存储中获取它

这可能是因为已经知道了它的密钥,并使用它。在这种情况下,你显然已经有了钥匙

您还可以通过运行查询来获取要更新的实体。在本例中,最终您将通过执行该方法获得实体
Query.GetAll()
返回它返回的实体的键:

func (q *Query) GetAll(c context.Context, dst interface{}) ([]*Key, error)
因此,例如,如果查询返回10个实体(将存储在
dst
中),它还将返回10个对应的键作为返回实体的切片。所以你也有你的钥匙

另一个选项是使用查询迭代器,由获取。在这种情况下,您可以通过调用来获取实际实体,该调用再次返回键:

func (t *Iterator) Next(dst interface{}) (*Key, error)
传输实体密钥 对于要更新实体的客户机,它必须具有某种唯一标识实体的信息,方便地标识其密钥。因此,当客户端请求实体时,服务器也应该发送其密钥。当客户机想要更新实体时,它必须随更新的数据一起发送密钥。因此,服务器将能够更新由密钥表示的适当实体

要向客户端发送密钥,可以使用将密钥编码为web安全字符串的方法

客户端应该发回这个相同的密钥字符串

服务器可以使用该函数将密钥字符串转换回一个值

注意:如果您使用的是数字标识,并且您知道其种类,则可以选择仅传输数字标识。您可以使用以下方法获取数字标识。您可以使用从服务器端的数字ID构造密钥,如下所示:

numericID = int64(0) // Get this from the request
key := datastore.NewKey(ctx, KINDNAME, "", numericID, nil)
查看以下关于钥匙的答案: