Я работаю над приложением Go, в котором у меня есть Entity с свойством, которое содержит идентификационный токен, который представляет собой случайную строку байтов. Я храню это свойство в виде байтовой строки, и в моей среде разработки я был в состоянии запросить для этого свойства, используя фильтр вида:Ошибка Google App Engine - запрос ByteString
// token is a []byte
idTok := datastore.ByteString(token)
q := ds.NewQuery("Entity").Filter("IDToken =", idTok)
var entities []Entity
keys, err := q.GetAll(c, &entities)
Но, к сожалению, когда развернута в качестве модуля для GAE, этот запрос возвращает ошибку: datastore: bad query filter value type: unsupported datastore value type: datastore.ByteString
, что сбивает с толку, поскольку я думал, что целью типа ByteString является возможность индексировать более короткие суммы двоичных данных под 500 байтами.
Я первый перешел к использованию типа байтовой строки на основе второго ответа на этот вопрос SO: Golang - Appengine datastore filter query with []byte comparison
Можете ли вы подтвердить, что 'len (токен)' не больше 500? Какую версию Go SDK вы используете? 1,2 или 1,4beta? Если последний, в вашем конфигурационном файле 'app.yaml' вы указали' api_version: go1.4beta'? – icza
Да, я сам генерирую токены, и они имеют длину 64 байта. Ошибка на самом деле даже возникает, когда в базе данных вообще нет сущностей, поэтому она, по-видимому, не связана с контекстом какого-либо объекта. У меня только версия api, указанная как api_version: go1'. Вы знаете, где описаны различия между версиями? – Aaron
Я нашел версию, отмеченную для среды выполнения GAE Go здесь: https://code.google.com/p/googleappengine/wiki/SdkForGoReleaseNotes, которые указаны в версии 1.9.11, была добавлена поддержка для 'ByteString', с примечанием: Добавьте 'ByteString' тип, чтобы разрешить короткие индексируемые байтовые фрагменты." Я подтвердил, что мой код работает в Google App Engine/1.9.18' с вызовом 'appengine.ServerSoftware()'. Я не уверен, как посмотреть, какая версия приложения Go работает, но похоже, что версия Go должна быть ортогональной функциональности движка приложения, предоставляемой через API – Aaron