2017-02-22 6 views
1

を完了することができ、私は、コードを実行したとき、私はGoogleのデータストアとValueError:のみ部分キーが

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) 

、次のようにコードは、辞書のリストを使用してデータストアにエンティティのコレクションを追加しようとしました、I次のエラー、

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) 

、にコードを変更した場合、エラーがなくなっています。しかし、entitiesの作成に違いはないので、最初のコードスニペットで何が問題になっているのだろうかと思います。

私はまた、これらのコードをテストするためにdatastore emulatorを使用しています。あなたの最初のコードで

答えて

2

は、あなただけの単一のエンティティを作成スニペットとentitiesはその単一エンティティへ同じ言及含むリストである - ので、リストが初期化された方法のを。あなたの問題の根本的な原因である可能性があります - それは引数として複数の同じエンティティで呼び出されているので、各val_dicts値とput_multi() barfsでそのエンティティを上書きしています。

2番目のスニペットでは、それぞれentities要素が別のエンティティであり問題はありません。説明するために

>>> 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>] 
>>> 

は、第一の場合における同じオブジェクトのアドレスに注意してください。

関連する問題