Datastore 함수

참고: 새로운 애플리케이션을 빌드하는 개발자는 NDB 클라이언트 라이브러리를 사용하는 것이 좋습니다. NDB 클라이언트 라이브러리는 이 클라이언트 라이브러리와 비교할 때 Memcache API를 통한 자동 항목 캐싱과 같은 여러 이점이 있습니다. 현재 이전 DB 클라이언트 라이브러리를 사용 중인 경우 DB에서 NDB로의 마이그레이션 가이드를 참조하세요.

이 페이지에서 설명하는 함수는 google.appengine.ext.db 패키지에 정의되어 있습니다.

함수

allocate_ids (model, count)

데이터 저장소 종류 및 상위 조합에 대해 데이터 저장소에 ID 배치를 할당합니다.

이 방법으로 할당된 ID는 Datastore의 자동 ID 시퀀스 생성기에서 사용되지 않으며 항목 키에서 충돌 없이 사용할 수 있습니다.

인수

model
ID 배치를 할당할 모델 키입니다. 일반 이지만 사용할 ID 시퀀스를 결정하기 위해서는 키의 상위 요소 및 종류만 있으면 됩니다.
count
할당할 ID 수입니다.

할당하는 첫 번째와 마지막 ID의 튜플을 반환합니다. 예를 들어 이 함수를 사용하여 10개의 ID를 할당한 경우 생성된 ID의 전체 목록이 아닌 (1, 10) 형식으로 반환합니다.

ID 할당 및 사용 예:

# allocate for MyModel without an instance
handmade_key = db.Key.from_path('MyModel', 1)
first_batch = db.allocate_ids(handmade_key, 10)
first_range = range(first_batch[0], first_batch[1] + 1)

# or allocate using an existing key
model_instance = MyModel.all().get()
second_batch = db.allocate_ids(model_instance.key(), 10)
second_range = range(second_batch[0], second_batch[1] + 1)

# and then use them! woo!
my_id = second_range.pop(0)
new_key = db.Key.from_path('MyModel', my_id)
new_instance = MyModel(key=new_key)
new_instance.put()
assert new_instance.key().id() == my_id

# the Datastore will not assign ids in first_batch or second_batch
another_instance = MyModel()
another_instance.put()
assert another_instance.key().id() not in first_range
assert another_instance.key().id() not in second_range
allocate_ids_async (model, count)

Datastore 종류 및 상위 조합에 대한 ID 배치를 Datastore에 비동기적으로 할당합니다.

이 함수는 비동기 객체를 반환한다는 점을 제외하면 allocate_ids()와 동일합니다. 반환 값에서 get_result()를 호출하여 호출을 차단하고 결과를 반환할 수 있습니다.

인수

model
db.Model 인스턴스, , 문자열로 ID를 할당할 ID 시퀀스를 지정하는 템플릿 역할을 합니다. 반환된 ID는 이 키와 상위 요소와 종류가 같은 항목에서만 사용해야 합니다.
count
할당할 ID 수입니다.

할당하는 첫 번째와 마지막 ID의 튜플을 반환합니다. 예를 들어 이 함수를 사용하여 10개의 ID를 할당한 경우 생성된 ID의 전체 목록이 아닌 (1, 10) 형식으로 반환합니다.

allocate_id_range (model, start, end, **kwargs)

특정 엔드포인트를 가진 ID 범위를 할당합니다. 이 ID가 할당되면 새로 생성된 항목에 수동으로 할당할 수 있습니다.

데이터 저장소의 자동 ID 할당자는 이미 할당된 키(자동 ID 할당 또는 명시적 'allocate_ids' 호출을 통해)를 절대 할당하지 않습니다. 결과적으로 주어진 키 범위에 쓰인 항목은 절대 덮어 쓰이지 않습니다. 하지만 이 범위에 수동으로 할당된 키를 가진 항목을 쓰는 경우 반환된 키 범위 상태에 따라 기존 항목(또는 별도의 요청으로 쓰인 새 항목)을 덮어쓸 수 있습니다.

예약하려는 기존 숫자 ID 범위(예: 이미 ID를 가진 일괄 로드 항목)가 있는 경우에만 이 함수를 사용하세요. 어떤 ID를 수신하든지 상관이 없다면 allocate_ids()를 대신 사용합니다.

인수

model
db.Model 인스턴스, , 문자열로 ID를 할당할 ID 시퀀스를 지정하는 템플릿 역할을 합니다. 반환된 ID는 이 키와 상위 요소와 종류가 같은 항목에서만 사용해야 합니다.
start
할당할 첫 번째 ID입니다. 숫자로 되어 있습니다.
end
할당할 마지막 ID입니다. 숫자로 되어 있습니다.

(KEY_RANGE_EMPTY, KEY_RANGE_CONTENTION, KEY_RANGE_COLLISION) 중 하나를 반환합니다. KEY_RANGE_EMPTY가 아니면 할당된 키 범위 사용과 관련된 잠재적인 문제를 나타냅니다.

create_transaction_options (**kwargs)

트랜잭션 실행을 제어하는 트랜잭션 옵션 객체(클래스 TransactionOptions)를 만듭니다. 결과 객체를 첫 번째 인수로 run_in_transaction_options() 함수에 전달합니다.

인수

propagation
이 트랜잭션 함수가 다른 트랜잭션 내에서 호출된 경우 수행할 작업입니다.
ALLOWED
이미 트랜잭션 중인 경우 계속해서 사용합니다. 그렇지 않은 경우 트랜잭션을 시작합니다.

참고: 이 정책을 사용하는 함수에서 예외가 발생할 경우 예외를 포착하고 외부 트랜잭션을 커밋하는 것이 안전하지 않을 수 있으며, 함수로 인해 외부 트랜잭션이 좋지 않은 상태로 남겨질 수 있습니다.

필수
기존 트랜잭션이 있는 경우 계속합니다. 그렇지 않은 경우 BadRequestError 예외를 발생시킵니다.

참고: 이 정책을 사용하는 함수에서 예외가 발생할 경우 예외를 포착하고 외부 트랜잭션을 커밋하는 것이 안전하지 않을 수 있으며, 함수로 인해 외부 트랜잭션이 좋지 않은 상태로 남겨질 수 있습니다.

INDEPENDENT
기존 트랜잭션을 일시 중지하고 새 트랜잭션을 만듭니다.

참고: 항목이 외부 트랜잭션과 일관성을 유지하지 않으므로 이 정책을 사용하는 함수는 새 트랜잭션에서 읽은 항목을 반환하지 않습니다.

NESTED
(아직 지원되지 않음) 기존 트랜잭션 내에 중첩 트랜잭션을 만듭니다.
xg
True인 경우 교차 그룹(XG) 트랜잭션을 허용합니다. 비부울 값으로 설정된 경우 BadArgumentError 예외가 발생합니다.
retries
트랜잭션 커밋이 실패할 경우 다시 시도할 재시도 횟수입니다.
deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 빠르게 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).

다음은 후속 교차 그룹(XG) 트랜잭션 옵션을 만드는 예입니다.

from google.appengine.ext import db

xg_on = db.create_transaction_options(xg=True)

def my_txn():
  x = MyModel(a=3)
  x.put()
  y = MyModel(a=7)
  y.put()

db.run_in_transaction_options(xg_on, my_txn)
delete (models, deadline=60)

데이터 저장소에서 하나 이상의 모델 인스턴스를 삭제합니다.

인수

models
모델 인스턴스, 항목 키 또는 모델 인스턴스 목록(또는 다른 반복 가능 항목) 또는 삭제할 항목 키입니다.
deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 바로 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).

put()과 마찬가지로 키가 여러 개 제공된 경우 항목 그룹이 2개 이상 있을 수 있습니다.

항목 중 일부가 실제로 삭제되었더라도 작업 중 오류가 일어난 경우 언제나 예외가 발생합니다. 예외가 발생하지 않고 호출이 반환된 경우 모든 항목이 성공적으로 삭제된 것입니다.

주의: 트랜잭션 내에서 작업이 수행된 경우를 제외하고는 단일 작업에서 여러 개의 항목을 삭제했다고 해서 삭제가 원자적으로 수행되는 것은 아닙니다. 쿼리가 강력한 일관성을 가지고 수행되었다고 하더라도 데이터 저장소를 쿼리하는 다른 프로세스에는 일관적이지 않은 결과가 표시될 수 있습니다.

delete_async (models, deadline=60)

Datastore에서 하나 이상의 모델 인스턴스를 비동기적으로 삭제합니다.

이 함수는 비동기 객체를 반환한다는 점을 제외하면 delete()와 동일합니다. 반환 값에서 get_result()를 호출하여 호출을 차단할 수 있습니다.

인수

models
모델 인스턴스, 항목 키 또는 모델 인스턴스 목록(또는 다른 반복 가능 항목) 또는 삭제할 항목 키입니다.
deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 바로 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).

put()과 마찬가지로 키가 여러 개 제공된 경우 항목 그룹이 2개 이상 있을 수 있습니다.

이 함수는 호출 결과를 차단할 수 있는 객체를 반환합니다.

항목 중 일부가 실제로 삭제되었더라도 작업 중 오류가 일어난 경우 언제나 예외가 발생합니다. 예외가 발생하지 않고 호출이 반환된 경우 모든 항목이 성공적으로 삭제된 것입니다.

주의: 트랜잭션 내에서 작업이 수행된 경우를 제외하고는 단일 작업에서 여러 개의 항목을 삭제했다고 해서 삭제가 원자적으로 수행되는 것은 아닙니다. 쿼리가 강력한 일관성을 가지고 수행되었다고 하더라도 데이터 저장소를 쿼리하는 다른 프로세스에는 일관적이지 않은 결과가 표시될 수 있습니다.

get (keys, read_policy=STRONG_CONSISTENCY, deadline=60)

데이터 저장소에서 주어진 키를 가진 특정 모델 인스턴스를 가져옵니다.

인수

keys
검색할 항목의 , 키의 문자열 표현, 키 또는 해당 문자열 표현의 목록입니다.
read_policy
원하는 수준의 데이터 일관성을 지정하는 읽기 정책입니다.
STRONG_CONSISTENCY
최신 결과를 보장하지만 단일 항목 그룹으로 제한됩니다.
EVENTUAL_CONSISTENCY
여러 항목 그룹을 포괄할 수 있지만 경우에 따라 오래된 결과를 반환하는 경우가 있습니다. 일반적으로 최종 일관성을 지닌 쿼리는 강력한 일관성을 지닌 쿼리보다 더 빨리 실행되지만 아무것도 보장되지 않습니다.

참고: 상위가 아닌 전역 쿼리는 이 인수를 무시합니다.

deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 바로 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).

keys가 단일 키(또는 키의 문자열 표현)로 구성되어 있는 경우 이 함수는 키가 Datastore에 있으면 해당 키와 관련된 모델 인스턴스를 반환합니다. 그렇지 않으면 None을 반환합니다. keys가 목록인 경우 반환값은 모델 인스턴스의 해당 목록이고, 지정된 키의 항목이 없는 경우 None입니다.

Model.get()도 참조하세요.

get_async (keys, read_policy=STRONG_CONSISTENCY, deadline=60)

Datastore에서 지정된 모델 인스턴스를 비동기적으로 가져옵니다.

이 함수는 비동기 객체를 반환한다는 점을 제외하면 get()과 동일합니다. 반환 값에서 get_result()를 호출하여 호출을 차단하고 결과를 얻을 수 있습니다.

인수

keys
검색할 항목의 , 키의 문자열 표현, 키 또는 해당 문자열 표현의 목록입니다.
read_policy
원하는 수준의 데이터 일관성을 지정하는 읽기 정책입니다.
STRONG_CONSISTENCY
최신 결과를 보장하지만 단일 항목 그룹으로 제한됩니다.
EVENTUAL_CONSISTENCY
여러 항목 그룹을 포괄할 수 있지만 경우에 따라 오래된 결과를 반환하는 경우가 있습니다. 일반적으로 최종 일관성을 지닌 쿼리는 강력한 일관성을 지닌 쿼리보다 더 빨리 실행되지만 아무것도 보장되지 않습니다.

참고: 상위가 아닌 전역 쿼리는 이 인수를 무시합니다.

deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 바로 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).

keys가 단일 키(또는 키의 문자열 표현)로 구성되어 있는 경우 이 함수는 키가 Datastore에 있으면 해당 키와 관련된 모델 인스턴스를 반환합니다. 그렇지 않으면 None을 반환합니다. keys가 목록인 경우 반환값은 모델 인스턴스의 해당 목록이고, 지정된 키의 항목이 없는 경우 None입니다.

Model.get()도 참조하세요.

get_indexes()

호출 애플리케이션에 속한 복합 색인의 목록을 반환합니다.

다음 예는 색인을 얻고 사용하는 방법을 보여줍니다.

def get_index_state_as_string(index_state):
  return {db.Index.BUILDING:'BUILDING', db.Index.SERVING:'SERVING',
          db.Index.DELETING:'DELETING', db.Index.ERROR:'ERROR'}[index_state]

def get_sort_direction_as_string(sort_direction):
  return {db.Index.ASCENDING:'ASCENDING',
          db.Index.DESCENDING:'DESCENDING'}[sort_direction]


def dump_indexes():
  for index, state in db.get_indexes():
    print "Kind: %s" % index.kind()
    print "State: %s" % get_index_state_as_string(state)
    print "Is ancestor: %s" % index.has_ancestor()
    for property_name, sort_direction in index.properties():
      print "  %s:%s" % (property_name,
                         get_sort_direction_as_string(sort_direction))
get_indexes_async ()

호출 애플리케이션에 속한 복합 색인의 목록을 비동기적으로 반환합니다.

is_in_transaction ()

현재 범위가 트랜잭션에서 실행 중인지 여부를 나타내는 부울을 반환합니다.

model_to_protobuf (model_instance)

Model 인스턴스의 프로토콜 버퍼 직렬화를 만듭니다. 프로토콜 버퍼는 원격 절차 호출에 사용되는 Google의 직렬화 형식으로 백업 및 복원 목적으로 Datastore 객체를 직렬화하는 데 유용합니다.

주의: 이 함수는 오픈소스 프로토콜 버퍼 형식과 다른(이전의) 형식을 사용하며 오픈소스 구현과 호환되지 않습니다.

인수

model_instance
직렬화할 클래스 Model(또는 서브클래스)의 인스턴스입니다.

객체의 프로토콜 버퍼 직렬화를 바이트 문자열로 반환합니다.

model_from_protobuf (pb)

프로토콜 버퍼 직렬화에 기반한 Model 인스턴스를 만듭니다. 자세한 내용은 model_to_protobuf()를 참조하세요.

인수

pb
model_to_protobuf()로 반환되는 프로토콜 버퍼 직렬화입니다.

적절한 종류 클래스의 객체를 반환합니다. 종류 클래스가 없으면 KindError 예외가 발생합니다. 객체가 모델에 유효하지 않으면 BadValueError 예외가 발생합니다.

다른 Model 인스턴스와 마찬가지로 put() 메서드의 호출 등을 통해 새 객체를 Datastore에 저장할 수 있습니다. 객체는 프로토콜 버퍼가 만들어졌을 때 가지고 있던 키를 보관합니다. 해당 키를 가지고 있는 객체가 이미 데이터 저장소에 있는 경우 비직렬화된 객체를 저장하면 기존 객체에 덮어쓰기됩니다.

주의: 객체의 키가 시스템에서 할당한 ID를 사용하고 ID가 이미 주어진 경로와 종류에 할당되어 있지 않은 경우 저장할 수는 있지만 ID는 예약되지 않습니다. 이후에 만들어진 객체가 해당 ID에 할당될 수 있으며 이전 객체를 덮어쓰기할 수 있습니다. 안전을 위해 직렬화되었을 때에 있었던 애플리케이션에서만 객체를 복원하세요.

model_is_projection (model_instance)

지정된 쿼리(model_instance)가 전체 항목의 쿼리가 아닌 프로젝션 쿼리인 경우 True를 반환합니다.

인수

model_instance
프로젝션 쿼리인지 결정하기 위해 확인하는 쿼리입니다.

쿼리가 프로젝션 쿼리이면 True를, 그렇지 않으면 False를 반환합니다.

put (models, deadline=60)

Datastore에 하나 이상의 모델 인스턴스를 씁니다.

인수

models
저장할 모델 인스턴스 또는 모델 인스턴스 목록입니다.
deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 빠르게 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).

여러 개의 모델 인스턴스가 주어진 경우 하나 이상의 항목 그룹이 있을 수 있습니다.

항목 중 일부가 실제로 쓰였더라도 작업 중 오류가 일어난 경우 언제나 예외가 발생합니다. 예외가 발생하지 않고 호출이 반환된 경우 모든 항목이 성공적으로 쓰인 것입니다.

models가 단일 모델 인스턴스로 구성되어 있는 경우 이 함수는 해당하는 객체를 반환합니다. models가 목록이라면 반환값은 해당하는 객체의 목록입니다.

주의: 트랜잭션 내에서 작업이 수행된 경우를 제외하고는 단일 작업에서 여러 개의 항목을 썼다고 해서 쓰기가 원자적으로 수행되지는 않습니다. 쿼리가 강력한 일관성을 가지고 수행되었다고 하더라도 데이터 저장소를 쿼리하는 다른 프로세스에는 일관적이지 않은 결과가 표시될 수 있습니다.

put_async (models, deadline=60)

Datastore에 하나 이상의 모델 인스턴스를 씁니다.

이 함수는 비동기 객체를 반환한다는 점을 제외하면 put()과 동일합니다. 반환 값에서 get_result()를 호출하여 호출을 차단하고 결과를 얻을 수 있습니다.

인수

models
저장할 모델 인스턴스 또는 모델 인스턴스 목록입니다.
deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 빠르게 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).

여러 개의 모델 인스턴스가 주어진 경우 하나 이상의 항목 그룹이 있을 수 있습니다.

항목 중 일부가 실제로 쓰였더라도 작업 중 오류가 일어난 경우 언제나 예외가 발생합니다. 예외가 발생하지 않고 호출이 반환된 경우 모든 항목이 성공적으로 쓰인 것입니다.

이 함수는 get_result()를 호출할 수 있는 비동기 객체를 반환합니다. 반환된 결과는 put()과 동일합니다.

주의: 트랜잭션 내에서 작업이 수행된 경우를 제외하고는 단일 작업에서 여러 개의 항목을 썼다고 해서 쓰기가 원자적으로 수행되지는 않습니다. 쿼리가 강력한 일관성을 가지고 수행되었다고 하더라도 데이터 저장소를 쿼리하는 다른 프로세스에는 일관적이지 않은 결과가 표시될 수 있습니다.

query_descendants (model_instance)

모델 인스턴스의 모든 하위 요소에 대한 쿼리를 반환합니다.

인수

model_instance
하위 요소를 찾을 모델 인스턴스입니다.
run_in_transaction (function, *args, **kwargs)

단일 트랜잭션에서 데이터 저장소 업데이트가 포함된 함수를 실행합니다. 트랜잭션 중 코드 예외가 하나라도 발생하면 트랜잭션에서 일어난 모든 업데이트가 롤백됩니다. 또는 @db.transactional() 데코레이터를 사용할 수 있습니다.

인수

함수
실행할 함수입니다.
args
함수에 전달할 위치 인수입니다.
kwargs
함수에 전달할 키워드 인수입니다.

함수가 값을 반환하면 run_in_transaction()이 호출자에게 값을 반환합니다.

함수에서 예외가 발생하면 트랜잭션은 롤백됩니다. Rollback 예외가 발생하면 다시 롤백되지 않습니다. 다른 예외인 경우 호출자에게 다시 롤백됩니다.

Datastore는 트랜잭션에 낙관적 잠금 및 재시도를 사용합니다. 함수가 준비한 트랜잭션을 커밋할 수 없는 경우 run_in_transaction()은 함수를 다시 호출하여 최대 3번 트랜잭션을 재시도합니다. 다른 재시도 횟수를 사용하려면 run_in_transaction_custom_retries()를 사용합니다. 트랜잭션 함수가 단일 트랜잭션에 대해 두 번 이상 호출될 수 있으므로 함수에는 인수 수정을 비롯한 부작용이 없어야 합니다.

높은 경합률 등의 이유로 트랜잭션을 커밋할 수 없으면 TransactionFailedError 예외가 발생합니다.

from google.appengine.ext import db

class Counter(db.Model):
  name = db.StringProperty()
  count = db.IntegerProperty(default=0)

def decrement(key, amount=1):
  counter = db.get(key)
  counter.count -= amount
  if counter.count < 0:        # Don't let counter go negative
    raise db.Rollback()
  db.put(counter)

q = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", "foo")
counter = q.get()
db.run_in_transaction(decrement, counter.key(), amount=5)
run_in_transaction_custom_retries (retries, function, *args, **kwargs)

단일 트랜잭션에서 데이터 저장소 업데이트가 포함된 함수를 실행하여 경합이 발생할 경우 지정된 횟수만큼 트랜잭션을 재시도합니다. 트랜잭션 중 코드 예외가 하나라도 발생하면 트랜잭션에서 일어난 모든 업데이트가 롤백됩니다.

재시도 횟수를 지정하는 기능을 제외하면 이 함수는 run_in_transaction()과 동일하게 동작합니다.

인수

retries
항목 그룹 내에서 경합이 발생할 경우 함수를 호출하는 최대 횟수입니다(둘 이상의 사용자가 동시에 그룹을 수정하려고 시도함).
함수
실행할 함수입니다.
args
함수에 전달할 위치 인수입니다.
kwargs
함수에 전달할 키워드 인수입니다.
run_in_transaction_options (options, function, *args, **kwargs)

단일 트랜잭션에서 트랜잭션 옵션 객체에 지정된 옵션을 사용하여 데이터 저장소 업데이트가 포함된 함수를 실행합니다. 트랜잭션 중 코드 예외가 하나라도 발생하면 트랜잭션에서 일어난 모든 업데이트가 롤백됩니다.

교차 그룹(XG) 트랜잭션의 경우 트랜잭션 옵션 객체의 xg 매개변수는 True로 설정해야 합니다.

인수

옵션
이 트랜잭션에서 사용된 설정을 포함하는 트랜잭션 옵션 객체입니다. XG 트랜잭션을 사용 설정하려면 xg 매개변수를 True로 설정해야 합니다.
함수
실행할 함수입니다.
args
함수에 전달할 위치 인수입니다.
kwargs
함수에 전달할 키워드 인수입니다.

함수가 값을 반환하면 run_in_transaction_options()가 호출자에게 값을 반환합니다.

함수에서 예외가 발생하면 트랜잭션은 롤백됩니다. Rollback 예외가 발생하면 다시 롤백되지 않습니다. 다른 예외인 경우 호출자에게 다시 롤백됩니다.

Datastore는 트랜잭션에 낙관적 잠금 및 재시도를 사용합니다. 함수가 준비한 트랜잭션을 커밋할 수 없는 경우 run_in_transaction_options()는 함수를 다시 호출하여 트랜잭션 옵션 객체에 지정된 재시도 횟수까지 트랜잭션을 재시도합니다. 단일 트랜잭션에 대해 트랜잭션 함수가 2번 이상 호출될 수 있으므로 함수에는 인수 수정 사항을 비롯한 부작용이 없어야 합니다.

높은 경합률 등의 이유로 트랜잭션을 커밋할 수 없으면 TransactionFailedError 예외가 발생합니다.

다음 예에서는 이 함수를 사용하여 교차 그룹 트랜잭션을 실행하는 방법을 보여줍니다.

from google.appengine.ext import db

xg_options = db.create_transaction_options(xg=True)

def my_txn():
  x = MyModel(a=3)
  x.put()
  y = MyModel(a=7)
  y.put()

db.run_in_transaction_options(xg_options, my_txn)
to_dict (model_instance, dictionary=None)

모델 인스턴스의 사전 표현을 만들고 반환합니다.

인수

model_instance
복사할 모델 인스턴스입니다.
dictionary
사전이 있는 경우, 모델의 데이터를 병합할 사전입니다. 모델 값은 사전의 값을 덮어씁니다. 모델 인스턴스의 필드에 해당하지 않는 사전 항목은 보존됩니다.

데코레이터

@db.transactional (propagation=ALLOWED, xg=False, retries=3, deadline=60)

함수가 db 트랜잭션 내에서 실행되도록 합니다. 따라서 run_in_transaction(func)을 호출하는 대신 func()를 호출할 수 있습니다.

인수

propagation
이 트랜잭션 함수가 다른 트랜잭션 내에서 호출된 경우 수행할 작업입니다.
ALLOWED
이미 트랜잭션 중인 경우 계속해서 사용합니다. 그렇지 않은 경우 트랜잭션을 시작합니다.

참고: 이 정책을 사용하는 함수에서 예외가 발생할 경우 예외를 포착하고 외부 트랜잭션을 커밋하는 것이 안전하지 않을 수 있으며, 함수로 인해 외부 트랜잭션이 좋지 않은 상태로 남겨질 수 있습니다.

필수
기존 트랜잭션이 있는 경우 계속합니다. 그렇지 않은 경우 BadRequestError 예외를 발생시킵니다.

참고: 이 정책을 사용하는 함수에서 예외가 발생할 경우 예외를 포착하고 외부 트랜잭션을 커밋하는 것이 안전하지 않을 수 있으며, 함수로 인해 외부 트랜잭션이 좋지 않은 상태로 남겨질 수 있습니다.

INDEPENDENT
기존 트랜잭션을 일시 중지하고 새 트랜잭션을 만듭니다.

참고: 항목이 외부 트랜잭션과 일관성을 유지하지 않으므로 이 정책을 사용하는 함수는 새 트랜잭션에서 읽은 항목을 반환하지 않습니다.

NESTED
(아직 지원되지 않음) 기존 트랜잭션 내에 중첩 트랜잭션을 만듭니다.
xg
True인 경우 교차 그룹(XG) 트랜잭션을 허용합니다. 비부울 값으로 설정된 경우 BadArgumentError 예외가 발생합니다.
retries
트랜잭션 커밋이 실패할 경우 다시 시도할 재시도 횟수입니다.
deadline
오류가 발생하여 중단되기 전 Datastore에서 결과를 반환하기까지 기다리는 최대 시간(초)입니다. 정수 또는 부동 소수점 값을 허용합니다. 기본값(60초)보다 높게 설정할 수는 없지만 특정 작업의 실패가 빠르게 도출될 수 있도록 낮게 조정할 수는 있습니다(예: 사용자에게 응답을 더 빨리 반환, 작업 재시도, 다른 작업 시도, 태스크 큐에 작업 추가).
@db.non_transactional (allow_existing=True)

트랜잭션 내에서 호출된 경우에도 함수가 db 외부에서 실행되도록 합니다.

인수

allow_existing
True인 경우 기존 트랜잭션 내에서 함수가 호출되도록 허용합니다. False인 경우 대신 BadRequestError 예외를 발생시킵니다.