从python appengine云端点返回的重复ID

时间:2013-06-06 21:44:51

标签: python google-app-engine endpoints-proto-datastore

我使用endpoints-proto-datastore库在app引擎上编写了一个非常简单的应用程序。我的列表方法有问题。我需要从javascript客户端查询数据,并能够根据用户输入更新任何特定实体。端点按预期返回实体数组,但有时有两个实体共享相同的id。这使得无法可靠地更新数据存储区中的实体,因为我无法分辨id实际属于哪一个。

Here,来自数据存储区查看器工具的屏幕截图: the screenshot

以及通过api explorer调用list方法的结果:

200 OK
<headers omitted>
{
 "items": [
  {
   "id": 5906470911296406000,
   "prices": [
    "$1000.00"
   ],
   "options": [
    "Chrome"
   ],
   "title": "New Equipment",
   "quantity": true
  },
  {
   "id": 5906470911296406000,
   "title": "New Equipment",
   "quantity": false
  }
 ]
}

您可以看到ID在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 个答案:

答案 0 :(得分:2)

您使用的是最新的SDK吗?以前的版本生成的ID太大而无法存储javascript float,因此两个唯一ID可以舍入/截断为相同的值。您的ID以000结尾表明这可能是原因。最新版本和实时环境不会遇到这个问题。

答案 1 :(得分:1)

这是因为Javascripts使用64-bit floats存储数字。

他们已经改变了这一点,实际上在版本1.8.0中他们修复了它并且自动ID更小,所以它们可以用JSON表示。在最新的blog post中,他们宣布在即将推出的版本中,这将得到保证,默认情况下分散的自动ID。