Python 3.x google datastore ValueError:只能完成部分密钥
我尝试使用字典列表将实体集合添加到数据存储中,代码如下:Python 3.x google datastore ValueError:只能完成部分密钥,python-3.x,google-app-engine,google-cloud-datastore,Python 3.x,Google App Engine,Google Cloud Datastore,我尝试使用字典列表将实体集合添加到数据存储中,代码如下: def add_rows(self, val_dicts): with self.client.transaction(): entities = [Entity(self.client.key(self.kind))] * len(val_dicts) for entity, update_dict in zip(entities, val_dicts):
def add_rows(self, val_dicts):
with self.client.transaction():
entities = [Entity(self.client.key(self.kind))] * len(val_dicts)
for entity, update_dict in zip(entities, val_dicts):
entity.update(update_dict)
self.client.put_multi(entities)
当我运行代码时,我得到了以下错误:
ValueError: Only a partial key can be completed.
但是如果我把代码改成
def add_rows(self, val_dicts):
with self.client.transaction():
entities = [Entity(self.client.key(self.kind)) for i in range(len(val_dicts))]
for entity, update_dict in zip(entities, val_dicts):
entity.update(update_dict)
self.client.put_multi(entities)
错误消失了。但是在创建实体方面没有区别,所以我想知道第一个代码片段中的问题是什么
我还使用数据存储模拟器来测试这些代码 在第一个代码片段中,您只创建了一个实体,实体
是一个列表,其中包含对该单个实体的相同的引用,这是因为该列表的初始化方式。这可能是问题的根本原因-您正在用每个val_dicts
value和put_multi()
barfs覆盖该实体,因为它是用同一实体多次作为参数调用的
在第二个代码段中,每个实体元素都是不同的实体,没有问题
举例说明:
>>> class Foo(object):
... pass
...
>>> [Foo()]*2
[<__main__.Foo object at 0x7fc9760eee80>, <__main__.Foo object at 0x7fc9760eee80>]
>>> [Foo() for i in range(2)]
[<__main__.Foo object at 0x7fc9760eeeb8>, <__main__.Foo object at 0x7fc9760eefd0>]
>>>
>>类Foo(对象):
... 通过
...
>>>[Foo()]*2
[, ]
>>>[Foo()表示范围内的i(2)]
[, ]
>>>
注意第1种情况下相同的对象地址