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种情况下相同的对象地址