2013-06-27 27 views
1

我正在嘗試查找有關如何使用Go在Appengine數據存儲上執行更新的有效示例。 我在網上找到的所有例子都非常模糊,主要解釋概念,而不是「真實生活」。 去的appengine文檔說:使用Go更新實體Appengine數據存儲

...「更新現有的實體是使用相同的密鑰執行另一個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) 
} 

我如何做一個更新的標誌特性改變其值湯姆1?

我對這件事有點困惑,因爲我無法完全理解如何爲每個實體存儲「密鑰」。

任何幫助將不勝感激。

回答

2

待辦事項更新您首先需要確定您的對象是新的還是舊的。 這可以是簡單的通過將下面的方法來您的用戶結構來完成:

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

這告訴數據存儲忽略標誌字段存儲和檢索的對象 並且當因爲int64類型的初始值是零,一

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

那麼下一步就是要麼使用一個IncompleteKey或密鑰,用於:新創建的對象可如果標誌爲零

因此,創建一個新的對象只需要設置用戶名和電子郵件來標識PUT語句

看起來是這樣的:

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 
} 

與不完整鍵,應用程序引擎會爲你生成一個新的密鑰。
後就把您可以指定新的關鍵是你的對象:

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

+0

非常感謝您的回覆,但我仍然有點混亂。 「todo你首先需要確定你的對象是新的還是舊的,這可以通過在你的User結構中添加下面的方法來簡單地完成:」。這對我來說並不簡單,你能幫我解決這個問題嗎?我沒有得到我將如何添加一個方法作爲我的結構上的屬性。這個方法總是返回零,所以我不明白在哪種情況下我的對象不會是新的。 –

+0

我將它添加到答案中,創建新用戶時不需要設置標誌值,只需在數據存儲操作後設置標誌值,然後IsNew會告訴您對象是否已在數據存儲區中(您設置標誌)或者如果它不是(標誌值仍爲0) –

+0

有人能夠分享一個工作示例嗎?我也有同樣的問題。我想將一個實體的「Active」屬性設置爲TRUE。 – deepakssn

相關問題