2011-10-26 8 views
0

私はGAE、Go、およびデータストアを扱っています。 (Goは、自動的に実体を参照解除されませんので、私はスライスとしてオフKeyポインタをParticipantsを保存思ってそれらのために。)Google Appengineデータストア内のエンティティをGoで更新する

type Coinflip struct {                                                      
    Participants []*datastore.Key 
    Head   string 
    Tail   string 
    Done   bool 
} 

type Participant struct { 
    Email string 
    Seen datastore.Time 
} 

は今、私は特定のでParticipantを見つけたい:私は、次の構造体を持っていますEmailアドレスは知り合いCoinflipに関連付けられています。そのような(これは動作します):

coinflip, _ := find(key_as_string, context) 
participants, _ := coinflip.fetchParticipants(context) /* a slice of Participant*/ 

var found *Participant 
for i := 0; i < len(participants) && found == nil; i++ { 
    if participants[i].Email == r.FormValue("email") { 
    found = &participants[i] 
    } 
} 
(*found).Seen = datastore.SecondsToTime(time.Seconds()) 

私はデータストアに*foundを保存するにはどうすればよいですか?私は明らかに鍵が必要ですが、Participant構造体とKeyの間の結合は非常に緩いです。

ここから進める方法がわかりません。 fetchParticipantsコールからも鍵を返す必要がありますか? JavaとPython GAEの実装はかなり簡単です(オブジェクトにput()を呼び出してください)。事前に

おかげで、

答えて

0

Goのデータとやりとりするには、新しいライブラリhttps://github.com/matryer/gae-recordsをデータストアのデータオブジェクトラッパーであるアクティブレコードに使用することを検討してください。それはあなたのための多くの面倒を並べ替えます。

例えば、それはサポートしています。

// create a new model for 'People' 
People := gaerecords.NewModel("People") 

// create a new person 
mat := People.New() 
mat. 
SetString("name", "Mat") 
SetInt64("age", 28) 
.Put() 

// load person with ID 1 
person, _ := People.Find(1) 

// change some fields 
person.SetInt64("age", 29).Put() 

// load all People 
peeps, _ := People.FindAll() 

// delete mat 
mat.Delete() 

// delete user with ID 2 
People.Delete(2) 

// find the first three People by passing a func(*datastore.Query) 
// to the FindByQuery method 
firstThree, _ := People.FindByQuery(func(q *datastore.Query){ 
    q.Limit(3) 
}) 

// build your own query and use that 
var ageQuery *datastore.Query = People.NewQuery(). 
    Limit(3).Order("-age") 

// use FindByQuery with a query object 
oldestThreePeople, _ := People.FindByQuery(ageQuery) 

// using events, make sure 'People' records always get 
// an 'updatedAt' value set before being put (created and updated) 
People.BeforePut.On(func(c *gaerecords.EventContext){ 
    person := c.Args[0].(*Record) 
    person.SetTime("updatedAt", datastore.SecondsToTime(time.Seconds())) 
}) 
1

は、私が呼んfetchParticipantsからだけでなく、キーを返す必要がありますか?

はい。そして、ちょうど (かなり単純に見えるJavaやPythonのGAEの実装

"FUNCプット(appengine.Context C、キー*キー、SRCインターフェイス{})(*キー、os.Error)" と呼んでオブジェクトにput()を呼び出す)。

恐らく公平な陳述。 Goコミュニティは「魔法」に対して非常に強い偏見を持っています。この場合、Participant構造体には宣言した2つのフィールドがあります。バックグラウンドでキーを追加することは魔法と見なされます。

関連する問題