duan0714 2013-06-27 03:47
浏览 50
已采纳

使用Go更新实体Appengine数据存储

I'm trying to find an effective example in how to perform updates on appengine datastore with Go. All the examples I've found on the web are very vague and mostly explains concepts and not the "real life". The appengine documentation for go says:

..."Updating an existing entity is a matter of performing another Put() using the same key."

My problem here is being in how to retrieve the key. So I have the code below to store and retrieve data:

func subscribe(w http.ResponseWriter, r *http.Request) {

    user := User {
        Name: r.FormValue("username"),
        Email: r.FormValue("useremail"),
        Flag: 0,
    }

    c := appengine.NewContext(r)
    //datastore.Put(c, datastore.NewIncompleteKey(c, "User", nil), &user)
    datastore.Put(c, datastore.NewKey(c, "User", "stringID", 0, nil), &user)

    template.Must(template.ParseFiles("confirmation.html")).Execute(w, nil)

}

func checkusers(w http.ResponseWriter, r *http.Request) {

    c := appengine.NewContext(r)

    qUsers := datastore.NewQuery("User")

    var users []User

    qUsers.GetAll(c, &users)

    template.Must(template.ParseFiles("users.html")).Execute(w, users)
}

How do I do an update on the flag property changing its value tom 1?

I'm a bit confused on this thing as I couldn't fully understand how the "key" is stored for each entity.

Any help would be very appreciated.

  • 写回答

1条回答 默认 最新

  • douren7179 2013-06-27 06:32
    关注

    todo an update you first need to identify if your object is a new or an old one. this can be simple done by adding the following method to your User struct:

    type User struct {
        Name string
        Email string
        Flag int64  `datastore:"-"`
    }
    func (u *User) IsNew() bool {
        return u.Flag == 0
    }
    

    this tells data-store to ignore the Flag field when storing and retrieving an object and because initial value of int64 is zero, a newly created object can be identified if Flag is zero

    so creating a new object just needs to set UserName and Email:

    user := User {
        Name: r.FormValue("username"),
        Email: r.FormValue("useremail")
    }
    

    then next step is to either use a IncompleteKey or a Key, for the put statement

    could look like this:

    var k *datastore.Key
    if user.IsNew() {
        k = datastore.NewIncompleteKey(c, "Users", nil)
    } else {
        k = datastore.NewKey(c, "Users", "", user.Flag, nil)
    }
    k, err := datastore.Put(c, k, user)
    if err != nil {
        return k, err
    }
    

    with an incomplete key, app-engine will generate a new key for you.
    after put you can assign the new key to your object:

    user.Flag = k.IntID
    

    now if you do a query later you need to assign the Id to your query result objects, the query will return the keys of query result in the same order so you can change your code like this:

    keys, err := q.GetAll(c, &users)
    if err != nil {
        return
    }
    l := len(users)
    for i := 0; i < l; i++ {
        users[i].Flag = keys[i].IntID()
    }
    

    thats all, for more information, just have a look a the reference document there is explained with methods return which values.
    https://developers.google.com/appengine/docs/go/datastore/reference

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c