Обновление объекта в хранилище данных Google Appengine с помощью Go - PullRequest
0 голосов
/ 26 октября 2011

Я играю с GAE, Go и хранилищем данных.У меня есть следующие структуры:

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

type Participant struct {
  Email string
  Seen  datastore.Time
}

(Для тех, кому интересно, я храню Participants в качестве фрагмента из Key указателей, потому что Go автоматически не разыменовывает объекты.)

Теперь яхочу найти 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() для объекта).

Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Нужно ли возвращать ключи также из вызова fetchParticipants?

Да.А затем вызвать "func Put (c appengine.Context, key * Key, src interface {}) (* Key, os.Error)"

Реализация Java и Python GAE кажется немного проще(просто вызовите put () для объекта).

Вероятно, справедливое утверждение.Сообщество Go имеет очень сильный уклон против "магии".В этом случае структура Участника имеет два поля, которые вы объявили.Добавление ключа к нему в фоновом режиме будет считаться магией.

0 голосов
/ 27 января 2012

Для взаимодействия с данными в Go рассмотрите возможность использования нашей новой библиотеки https://github.com/matryer/gae-records для Active Record, оболочки объектов данных вокруг хранилища данных.Он решает много проблем для вас.

Например, он поддерживает:

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