3

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

这里是数据存储查看器工具的屏幕截图: 截图

以及通过 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
  }
 ]
}

您可以在 api explorer 中看到 id 重复,但在数据存储中没有。到目前为止,我一直无法可靠地产生这种行为,但似乎只有当我将两个与上面非常相似的实体添加到数据存储区时才会发生这种情况。

我的模型:

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

所有这些测试都是在本地开发服务器上进行的。谢谢你提供的所有帮助。

4

2 回答 2

2

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

于 2013-06-06T23:11:22.937 回答
1

这是因为 Javascripts 使用64 位浮点数存储数字。

他们已经改变了这一点,实际上在 1.8.0 版本中他们修复了它,并且自动 ID 更小,因此可以用 JSON 表示。在最新的博客文章中,他们宣布在即将发布的版本中,这将得到保证,并且分散的自动 ID 将默认为。

于 2013-06-06T23:14:51.533 回答