Как игнорировать ошибки в datastore.Query.GetAll ()? - PullRequest
2 голосов
/ 21 января 2012

Я только начал разрабатывать приложение GAE со средой выполнения Go, пока это было приятно. Однако я столкнулся со следующей неудачей:

Я пользуюсь гибкостью, которую обеспечивает хранилище данных, поскольку несколько разных структур с разными свойствами сохраняются под одним и тем же именем объекта («Элемент»). Ссылка на хранилище данных языка Go *1003* 1004 * гласит, что «фактические передаваемые типы не должны совпадать между вызовами Get и Put или даже между различными запросами App Engine», поскольку сущности на самом деле являются просто набором свойств и поэтому могут храниться в соответствующем типе контейнера, который может их поддерживать.

Мне нужно запросить все сущности, хранящиеся под именем сущности «Item», и закодировать их как JSON одновременно. Используя эту гибкость свойства сущности в моём преимуществе, можно сохранять запрашиваемые сущности в произвольных datastore.PropertyList, однако функции Get и GetAll возвращают ErrFieldMismatch как ошибку, когда свойство запрашиваемых сущностей не может быть должным образом представлены (то есть несовместимые типы или просто отсутствующее значение). Все эти структуры, которые я сохраняю, создаются пользователем, и большинство значений являются необязательными, поэтому в хранилище данных сохраняются пустые значения. При сохранении этих структур с пустыми значениями проблем нет (снова гибкость хранилища данных), но есть при их получении.

В документации Go хранилища данных также указано, что вызывающий метод Get должен сам решать, являются ли ошибки, возвращаемые из-за пустых значений, игнорируемыми, восстанавливаемыми или фатальными. Я хотел бы знать, как правильно сделать это, поскольку простого игнорирования ошибок будет недостаточно, поскольку структуры назначения (datastore.PropertyList) моих запросов вообще не заполняются, когда запрос приводит к этой ошибке.

Заранее спасибо, и извините за длинный вопрос.

Обновление: вот код

query := datastore.NewQuery("Item") // here I use some Filter calls, as well as a Limit call and an Order call
items := make([]datastore.PropertyList, 0)
_, err := query.GetAll(context, &items) // context has been obviously defined before
if err != nil {
    // something to handle the error, which in my case, it's printing it and setting the server status as 500
}

Обновление 2: вот какой-то вывод

Если я использую make([]datastore.PropertyList, 0), я получаю это:

datastore: invalid entity type

И если я использую make(datastore.PropertyList, 0), я получаю это:

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

И в обоих случаях (первый, я полагаю, можно отбросить) в items я получаю это:

[]

1 Ответ

1 голос
/ 21 января 2012

Согласно следующему сообщению модуль хранилища данных go еще не поддерживает PropertyList.

Вместо этого используйте указатель на фрагмент datastore.Map.

...