Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为新实体分配的id已在使用中_Python_Google App Engine_App Engine Ndb - Fatal编程技术网

Python 为新实体分配的id已在使用中

Python 为新实体分配的id已在使用中,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我最近将实体从一个名称空间移动到另一个名称空间,并添加了一个父名称空间。此后,我注意到出现了以下错误: BadRequestError: the id allocated for a new entity was already in use, please try again: app: "p~appid" name_space: "xyz" path < Element { type: "Challenge" name: "chal" } Element {

我最近将实体从一个名称空间移动到另一个名称空间,并添加了一个父名称空间。此后,我注意到出现了以下错误:

BadRequestError: the id allocated for a new entity was already in use, please try again: app: "p~appid"
name_space: "xyz"
path <
  Element {
    type: "Challenge"
    name: "chal"
  }
  Element {
    type: "Answer"
    id: 0x14657000000000
  }
>
BadRequestError:为新实体分配的id已在使用中,请重试:app:“p~appid”
名称_空格:“xyz”
路径<
元素{
类型:“挑战”
姓名:“查尔”
}
元素{
类型:“回答”
id:0x14657000000
}
>
经过一些研究,我得出结论,这是因为id生成器生成的数字id已经存在。因为我将实体移动到了另一个路径,所以使用了不同的id生成器,并且该生成器不知道现有的id

我真的想防止这种情况发生,因为这会导致请求失败。我为旧的
db
api找到了许多解决方案,这些解决方案涉及分配特定的id,这些id很麻烦,因此生成器知道这些id的存在。但是,我似乎无法为ndb模型分配特定id

我曾尝试使用重试来重试放置模型,但这似乎也没有帮助


有什么办法可以解决这个问题吗?

我还没有测试过这个问题,但我认为解决方案是使用allocate\u id(1,parent=old\u parent\u key)并使用新的\u parent\u key来创建您将要使用的实际密钥

id = ndb.Model.allocated_ids(size=1, parent=old_parent_key)[0]
key = ndb.Key(cls, id, parent=new_parent_key).
因此,旧的\u parent\u键是您以前使用的父项,您可以使用新的\u parent\u键(您现在正在使用)创建键。据我所知,allocate_ID实际上并没有获取实体


我还没有测试过这一点,但我认为解决方案是使用allocate\u id(1,parent=old\u parent\u key)并使用新的\u parent\u key创建您将要使用的实际密钥

id = ndb.Model.allocated_ids(size=1, parent=old_parent_key)[0]
key = ndb.Key(cls, id, parent=new_parent_key).
因此,旧的\u parent\u键是您以前使用的父项,您可以使用新的\u parent\u键(您现在正在使用)创建键。据我所知,allocate_ID实际上并没有获取实体