Помещение множества PropertyList в хранилище данных Google App Engine (в Go) и их загрузка снова с помощью Query.GetAll - PullRequest
4 голосов
/ 19 января 2012

Я помещаю сущности (как datastore.PropertyList) в хранилище данных следующим образом:

// save one
var plist datastore.PropertyList = make(datastore.PropertyList, 3)
plist = append(plist, datastore.Property { "name", "Mat", false, false })
plist = append(plist, datastore.Property { "age", "29", false, false })
plist = append(plist, datastore.Property { "location", "London", false, false })
key := datastore.NewIncompleteKey(context, "Record", nil)
datastore.Put(context, key, &plist)

// save another one
var plist datastore.PropertyList = make(datastore.PropertyList, 3)
plist = append(plist, datastore.Property { "name", "Laurie", false, false })
plist = append(plist, datastore.Property { "age", "27", false, false })
plist = append(plist, datastore.Property { "location", "London", false, false })
key := datastore.NewIncompleteKey(context, "Record", nil)
datastore.Put(context, key, &plist)

Это все работает нормально (хотя приведенный выше код больше похож на псевдокод). Я могу загрузить их по отдельности, и datastore.PropertyList выходит с каждым полем как своим datastore.Property.

Однако, когда я пытаюсь получить многие из них, используя Query, происходит сбой:

query := datastore.NewQuery("Record")

plists := make(datastore.PropertyList, 0, 10)
keys, err := query.GetAll(context, &plists)

Я получаю следующую ошибку:

datastore: cannot load field "age" into a "datastore.Property": no such struct field

Кажется, что он не жалуется на Name, потому что это действительное свойство datastore.Property, так как мне заставить его загружать элементы, как предполагалось, с каждым элементом в plists datastore.PropertyList вместо datastore.Property?

Ответы [ 3 ]

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

Я изменил реализацию для использования интерфейса PropertyLoadSaver - вы можете видеть, что он прекрасно работает в нашей новой оболочке стиля Active Record для хранилища данных: http://github.com/matryer/gae-records (см. record.go типа Load и Save методы)

2 голосов
/ 20 января 2012

Попробуйте написать имена полей с большой буквы, например, вместо age, напишите Age.Это говорит Go о том, что ваше поле экспортировано (это похоже на концепцию открытых переменных, хотя и идет немного дальше).

Согласно документации Go datastore (посмотрите наМетод Get в разделе Функции), вызов метода Get или GetAll вернет ErrFieldMismatch ", когда поле должно быть загружено в тип, отличный от того, из которого оно было сохранено, или когдаполе отсутствует или не экспортировано в целевой структуре . ErrFieldMismatch возвращается, только если dst является указателем структуры. ".Мое предположение заключается в том, что, поскольку вы сохранили его как PropertyList с неэкспортированными именами, а хранилище данных является гибким в своих моделях, исходные значения будут считаться неэкспортированными из-за строчных букв.У меня сейчас такая же ошибка, но мне удалось отследить ее из-за некоторых пустых полей.

Если это решит вашу проблему, пожалуйста, дайте мне знать.

2 голосов
/ 20 января 2012

GetAll запускает запрос в заданном контексте и возвращает все ключи, соответствующие этому запросу, а также добавляет значения в dst. DST должен быть указателем на фрагмент структур, указателей структур или карт. Если q является запросом «только для ключей», GetAll игнорирует dst и возвращает только ключи.

И согласно следующему посту модуль go datastore пока не поддерживает PropertyList.

Вместо этого используйте указатель на фрагмент хранилища данных. Карта.

Также обратите внимание, что вам нужно сделать вызов make([]T, n), чтобы сделать срез T, а не make(T, n)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...