2012-03-07 8 views
0

pythonのModel.get_or_insert(key_name, **kwds)メソッドのgoogleアプリケーションエンジンの仕組みを理解できません。Model.get_or_insert()とアプリエンジンの先祖取引との関係

トランザクション内のすべてのデータストア操作は、祖先クエリでなければなりません。しかし、私はModel.get_or_insert(key_name, **kwds)のドキュメントがどのように祖先クエリであるかわかりません。 「親」が最後の行の引数で指定されていないので、以下、例えば、2行目のparent=kwds.get('parent')の結果は、このように祖先クエリとしてクエリを否定、Noneできないでしょう?:

def txn(key_name, **kwds): 
    entity = Story.get_by_key_name(key_name, parent=kwds.get('parent')) # parent is not defined? 
    if entity is None: 
     entity = Story(key_name=key_name, **kwds) 
     entity.put() 
    return entity 

def get_or_insert(key_name, **kwargs): 
    return db.run_in_transaction(txn, key_name, **kwargs) 

get_or_insert('some key', title="The Three Little Pigs") # no parent specified 

link to documentation

私はここで毛を分割しようとしていません。自分のアプリケーションでトランザクションを正しく使用する方法を理解していないだけでなく、このドキュメントを参考にして理解を深めています。

ご協力いただきありがとうございます。

答えて

3

複数のエンティティを含むトランザクションのアトミック性を保証するには、祖先クエリが必要です。トランザクション内のすべてのエンティティは、同じ祖先を共有する必要があります。 Model.get_or_insert()は、同じ祖先を明らかに共有するエンティティを1つだけ取得します。

キーパス/祖先によって、App Engineデータストアにデータがどのように格納されるかが決まります。共通の祖先を持つエンティティは同じデータベース・シャードに格納されているため、シャード間の同期を取ることなくアトミック・トランザクションを実装するのが容易になります。

この時点ではおそらくHRDを使用している場合は、クロスグループトランザクションも使用できますが、背後でどのように機能しているかはあまり確信がありません。 http://code.google.com/appengine/docs/python/datastore/overview.html#Cross_Group_Transactions

+0

xg = transaction()関数にtrueを渡します。次に、1つに制限されるのではなく、トランザクションコールバックで最大5つのエンティティグループに触れることができます。 –

1

トランザクションにオブジェクトが1つしかない限り、「祖先なし」を渡すことができます。
複数のエンティティを作成/取得しようとすると例外がスローされます。