使用Go更新Appengine Datastore中的实体

huangapple go评论85阅读模式
英文:

Update Entity Appengine Datastore with Go

问题

我正在尝试找到一个有效的示例,以了解如何使用Go在appengine数据存储中执行更新操作。
我在网上找到的所有示例都非常模糊,大多数只解释了概念,而不是“真实生活”。
appengine的Go文档中说:

...“更新现有实体只需要使用相同的键执行另一个Put()操作。”

我的问题在于如何检索键。所以我有以下代码来存储和检索数据:

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)
}

如何更新flag属性并将其值更改为1?

我对此有些困惑,因为我无法完全理解每个实体的“键”是如何存储的。

非常感谢任何帮助。

英文:

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

得分: 2

要更新一个对象,首先需要确定它是一个新对象还是一个旧对象。
可以通过向User结构体添加以下方法来简单实现:

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

这告诉数据存储在存储和检索对象时忽略Flag字段,
并且由于int64的初始值为零,可以通过Flag是否为零来识别新创建的对象。

因此,创建一个新对象只需要设置UserName和Email:

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

然后下一步是为put语句使用IncompleteKey或Key。

可以像这样:

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
}

使用不完整的键,应用程序引擎将为您生成一个新键。
在put之后,您可以将新键分配给您的对象:

user.Flag = k.IntID

现在,如果您稍后进行查询,您需要将Id分配给查询结果对象,
查询将以相同顺序返回查询结果的键,因此您可以像这样更改代码:

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()
}

就是这样,有关更多信息,请查看参考文档,其中解释了方法返回哪些值。
https://developers.google.com/appengine/docs/go/datastore/reference

英文:

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:&quot;-&quot;`
}
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(&quot;username&quot;),
    Email: r.FormValue(&quot;useremail&quot;)
}

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, &quot;Users&quot;, nil)
} else {
	k = datastore.NewKey(c, &quot;Users&quot;, &quot;&quot;, 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, &amp;users)
if err != nil {
	return
}
l := len(users)
for i := 0; i &lt; 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

huangapple
  • 本文由 发表于 2013年6月27日 11:47:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/17334205.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定