2012-03-07 1 views
0

파이썬의 Model.get_or_insert(key_name, **kwds) 메소드에 대한 Google 애플리케이션 엔진이 어떻게 작동하는지 이해할 수 없습니다.Model.get_or_insert()가 응용 프로그램 엔진에서 조상 트랜잭션 인 방법

제 생각에 트랜잭션 내부의 모든 데이터 저장소 연산은 조상 쿼리 여야합니다. 그러나 Model.get_or_insert(key_name, **kwds)의 설명서가 조상 쿼리 인 방법을 알 수 없습니다. 다음과 같은 예를 들어, '부모'이후 두 번째 줄에 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()는 하나의 엔티티 만 검색합니다. 엔티티는 분명히 자신과 동일한 조상을 공유합니다.

키 경로/조상은 App Engine 데이터 저장소에 데이터가 저장되는 방식을 결정합니다. 공통 조상을 가진 엔티티는 동일한 데이터베이스 샤드에 저장되므로 샤드 간의 동기화없이 원자 트랜잭션을보다 쉽게 ​​구현할 수 있습니다.

HRD를 사용하고 있다면이 시점에서 아마도 HRD를 사용하고있을 것입니다.하지만 그룹에서 처리하는 방법에 대해서는 확신이 없지만 크로스 그룹 트랜잭션도 사용할 수 있습니다. http://code.google.com/appengine/docs/python/datastore/overview.html#Cross_Group_Transactions

+0

transaction() 함수에 xg = True를 전달하십시오. 그런 다음 하나의 트랜잭션 그룹으로 제한하는 대신 트랜잭션 콜백에서 최대 5 개의 엔티티 그룹을 조정할 수 있습니다. –

1

트랜잭션에 개체가 하나만있는 경우 없음 조상을 전달할 수 있습니다.
하나 이상의 엔티티를 생성/가져 오려고하면 예외가 발생합니다.

관련 문제