Дублированные идентификаторы, возвращенные из конечной точки облака Python Appengine
Я написал очень простое приложение на движке приложения, используя библиотеку endpoints-proto-datastore. У меня проблемы с моим методом списка. Мне нужно запросить данные у клиента javascript и иметь возможность обновлять любую конкретную сущность на основе пользовательского ввода. Конечная точка возвращает массив объектов, как и ожидалось, но иногда есть два объекта, которые имеют один и тот же идентификатор. Это делает невозможным надежное обновление объекта в хранилище данных, так как я не могу сказать, к какому из них фактически принадлежит идентификатор.
Вот скриншот из инструмента просмотра хранилища данных:
и результат вызова метода списка через проводник API:
200 OK
<headers omitted>
{
"items": [
{
"id": 5906470911296406000,
"prices": [
"$1000.00"
],
"options": [
"Chrome"
],
"title": "New Equipment",
"quantity": true
},
{
"id": 5906470911296406000,
"title": "New Equipment",
"quantity": false
}
]
}
Вы можете видеть, что идентификаторы дублируются в проводнике API, но не в хранилище данных. До сих пор мне не удавалось достоверно воспроизвести это поведение, но, похоже, это происходит только тогда, когда я добавляю в хранилище данных две сущности, которые очень похожи, как и выше.
Моя модель:
class AvailableEquipment(EndpointsModel):
_message_fields_schema = ('id', 'title', 'options', 'prices', 'quantity')
title = ndb.StringProperty()
options = ndb.StringProperty(repeated=True)
prices = ndb.StringProperty(repeated=True)
quantity = ndb.BooleanProperty()
Мой API:
@endpoints.api(name='equipment', version='v1', description='API for available equipment data')
class AvailableEquipmentAPI(remote.Service):
@AvailableEquipment.method(path='equipment', http_method='POST', name='insert')
def EquipmentInsert(self, equipment):
equipment.put()
return equipment
@AvailableEquipment.query_method(path='equipment', name='list')
def EquipmentList(self, query):
return query
Все эти тесты были проведены на локальном сервере разработки. Спасибо за любую помощь, которую вы можете оказать.
2 ответа
Это связано с тем, что Javascripts хранит числа, используя 64-битные числа с плавающей точкой.
Они уже изменили это, и фактически в версии 1.8.0 они исправили это, и автоматический ID меньше, поэтому они могут быть представлены в JSON. В последнем сообщении в блоге они объявили, что в следующей версии это будет гарантировано, и разбросанные автоматические идентификаторы будут по умолчанию.
Вы используете самый последний SDK? В предыдущей версии генерировались идентификаторы, которые были слишком велики для хранения с плавающей точкой javascript, поэтому два уникальных идентификатора могли округлять / усекать до одинакового значения. То, что ваши идентификаторы заканчиваются на 000, указывают на то, что это может быть причиной. Последняя версия и живая среда не страдают от этой проблемы.