항목, 속성, 키

참고: 새로운 애플리케이션을 빌드하는 개발자에게는 NDB 클라이언트 라이브러리 사용을 적극 권장합니다. 기존 클라이언트 라이브러리에 비해 Memcache API를 통한 자동 항목 캐싱과 같은 여러 이점이 있습니다. 현재 기존 DB 클라이언트 라이브러리를 사용하는 중이라면 DB에서 NDB로의 마이그레이션 가이드를 참조하세요.

Cloud Datastore의 데이터 객체를 항목이라고 부릅니다. 항목에는 하나 이상의 명명된 속성이 있으며 각 속성에는 하나 이상의 값이 포함될 수 있습니다. 동일 종류의 항목이라도 속성이 동일할 필요는 없으며, 지정된 속성의 항목 값이 모두 동일한 데이터 유형일 필요도 없습니다. (필요한 경우 애플리케이션이 자체 데이터 모델에 이러한 제한을 설정하고 시행할 수 있습니다.)

Cloud Datastore는 다양한 속성 값의 데이터 유형을 지원합니다. 여기에는 다음 사항이 포함됩니다.

  • 정수
  • 부동 소수점 수
  • 문자열
  • 날짜
  • 바이너리 데이터

전체 유형 목록은 속성 및 값 유형을 참조하세요.

Cloud Datastore의 각 항목에는 항목을 고유하게 식별하는 가 있습니다. 키는 다음 구성 요소로 구성됩니다.

  • 다중 테넌트 지원을 허용하는 항목의 네임스페이스
  • Cloud Datastore 쿼리 목적으로 분류되는 항목의 종류
  • 개별 항목의 식별자는 다음 중 하나일 수 있습니다.
    • 키 이름 문자열
    • 정수 숫자 ID
  • Cloud Datastore 계층구조에서 항목을 찾는 선택적 상위 경로

애플리케이션은 항목의 키를 사용하여 Cloud Datastore에서·개별 항목을 가져오거나 항목의 키 또는 속성 값에 따라 쿼리를 실행하여 하나 이상의 항목을 검색할 수 있습니다.

Python App Engine SDK에는 Cloud Datastore 항목을 Python 클래스의 인스턴스로 나타내고, 이러한 인스턴스를 Datastore에 저장하고 검색하기 위한 데이터 모델링 라이브러리가 포함되어 있습니다.

Cloud Datastore 자체는 지정된 속성에 특정 유형의 값이 포함되는지 여부와 같은 항목 구조에 대한 어떠한 제한도 적용하지 않습니다. 이러한 작업은 애플리케이션 및 데이터 모델링 라이브러리에서 수행됩니다.

종류 및 식별자

각 Cloud Datastore 항목은 쿼리 목적으로 항목을 분류하는 특정 종류에 속합니다. 예를 들어 인사 관리 애플리케이션은 회사에서 각 직원을 Employee 종류의 항목으로 나타낼 수 있습니다. Python Datastore API에서 항목 종류는 해당 모델 클래스에 따라 결정되며, 이러한 클래스는 애플리케이션에서 데이터 모델링 라이브러리 클래스인 db.Model의 하위 클래스로 정의합니다. 모델 클래스 이름은 여기에 속하는 항목의 종류가 됩니다. 두 개의 밑줄(__)로 시작하는 모든 종류의 이름은 예약되어 있으며 사용할 수 없습니다.

다음 예에서는 Employee 종류의 항목을 만들고, 해당 속성 값을 채우고, 이를 Datastore에 저장합니다.

import datetime
from google.appengine.ext import db

class Employee(db.Model):
  first_name = db.StringProperty()
  last_name = db.StringProperty()
  hire_date = db.DateProperty()
  attended_hr_training = db.BooleanProperty()

employee = Employee(first_name='Antonio',
                    last_name='Salieri')

employee.hire_date = datetime.datetime.now().date()
employee.attended_hr_training = True

employee.put()

Employee 클래스는 데이터 모델의 4가지 속성 first_name, last_name, hire_date, attended_hr_training을 선언합니다. Model 상위 클래스는 Employee 객체의 속성이 이 모델을 준수하도록 보장합니다. 예를 들어 hire_date 속성에 문자열 값을 할당하려고 시도하면 hire_date의 데이터 모델이 db.DateProperty로 선언되었기 때문에 런타임 오류가 발생합니다.

종류 외에도 각 항목에는 항목이 생성될 때 할당된 식별자가 있습니다. 식별자는 항목 키의 일부이므로 항목과 영구적으로 연관되며 변경할 수 없습니다. 식별자를 할당할 수 있는 두 가지 방법은 다음과 같습니다.

  • 애플리케이션에서 항목에 대한 고유한 키 이름 문자열을 지정할 수 있습니다.
  • Cloud Datastore에서 항목에 정수 숫자 ID를 자동으로 할당하도록 할 수 있습니다.

항목에 키 이름을 할당하려면 항목을 만들 때 이름이 지정된 인수 key_name을 모델 클래스 생성자에 제공합니다.

# Create an entity with the key Employee:'asalieri'.
employee = Employee(key_name='asalieri')

Cloud Datastore가 숫자 ID를 자동으로 할당하도록 하려면 key_name 인수를 생략합니다.

# Create an entity with a key such as Employee:8261.
employee = Employee()

식별자 할당

2개의 서로 다른 자동 ID 정책을 사용해서 자동 ID를 생성하도록 Cloud Datastore를 구성할 수 있습니다.

  • default 정책은 대략적으로 균일하게 배포된 사용되지 않은 ID의 임의 시퀀스를 생성합니다. 각 ID의 최대 길이는 16자입니다.
  • legacy 정책은 연속적이지 않은 작은 정수 ID 시퀀스를 만듭니다.

사용자에게 또는 주문에 따라 항목 ID를 표시하려면 수동으로 할당하는 것이 가장 좋습니다.

Cloud Datastore는 균일하게 배포된 사용하지 않은 ID의 임의 순서를 생성합니다. 각 ID의 최대 길이는 16자입니다.

시스템 할당 ID 값은 항목 그룹에 고유합니다. 한 개의 항목 그룹 또는 네임스페이스에서 다른 그룹이나 네임스페이스로 항목을 복사하고 키의 ID 부분을 보존하려는 경우 해당 ID를 먼저 할당해서 이후에 할당할 때 Cloud Datastore에서 해당 ID가 선택되지 않도록 방지합니다.

상위 경로

Cloud Datastore의 항목은 파일 시스템의 디렉토리 구조와 유사한 계층적으로 구성된 공간을 형성합니다. 항목을 만들 때는 선택적으로 다른 항목을 상위로 지정할 수 있습니다. 새 항목은 상위 항목의 하위입니다. 파일 시스템과 달리 상위 항목이 실제로 존재할 필요는 없습니다. 상위가 없는 항목은 루트 항목입니다. 항목과 상위 항목 간의 연결은 영구적이며, 항목이 생성되면 변경할 수 없습니다. Cloud Datastore는 상위가 동일한 두 개의 항목 또는 두 개의 루트 항목(상위가 없는 항목)에 동일한 숫자 ID를 할당하지 않습니다.

항목의 상위, 상위의 상위 등은 재귀적으로 해당 상위가 되며, 하위, 하위의 하위 등은 하위가 됩니다. 루트 항목 및 루트 항목의 모든 하위 요소는 동일한 항목 그룹에 속합니다. 루트 항목으로 시작해서 상위에서 하위로 진행되고, 제공된 항목으로 이어지는 항목 시퀀스에 따라 해당 항목의 상위 경로가 구성됩니다. 항목을 식별하는 전체 키는 상위 경로를 지정하고 항목 자체로 끝나는 종류-식별자 쌍의 시퀀스로 구성됩니다.

[Person:GreatGrandpa, Person:Grandpa, Person:Dad, Person:Me]

루트 항목의 경우 상위 경로는 비어 있으며, 키는 항목의 고유한 종류 및 식별자로만 구성됩니다.

[Person:GreatGrandpa]

이 개념은 다음 다이어그램에서 설명합니다.

항목 그룹

항목의 상위를 지정하려면 하위 항목을 만들 때 모델 클래스 생성자에 parent 인수를 사용합니다. 이 인수의 값은 상위 항목 자체이거나 해당 키일 수 있습니다. 상위 항목의 key() 메소드를 호출하여 키를 가져올 수 있습니다. 다음 예에서는 Address 종류의 항목을 만들고 Employee 항목을 해당 상위로 지정하는 두 가지 방법을 보여줍니다.

# Create Employee entity
employee = Employee()
employee.put()

# Set Employee as Address entity's parent directly...
address = Address(parent=employee)

# ...or using its key
e_key = employee.key()
address = Address(parent=e_key)

# Save Address entity to datastore
address.put()

트랜잭션 및 항목 그룹

항목을 생성, 업데이트 또는 삭제하려는 모든 시도는 트랜잭션의 컨텍스트에서 수행됩니다. 단일 트랜잭션은 이러한 작업을 여러 개 포함할 수 있습니다. 데이터의 일관성을 유지하기 위해 트랜잭션은 여기에 포함된 모든 작업이 Cloud Datastore에 하나의 단위로 적용되었는지 확인하고, 작업 중 일부라도 조건에 부합하지 않을 경우 모든 작업이 적용되지 않습니다. 또한 동일 트랜잭션 내에서 수행되는 모든 강력한 일관성의 읽기(상위 쿼리 또는 가져오기)에서 데이터의 일관된 스냅샷이 관측됩니다.

위에 언급한 대로 항목 그룹은 상위 항목을 통해 공통 루트 요소에 연결되는 항목 집합입니다. 데이터를 항목 그룹으로 구성하면 트랜잭션이 수행할 수 있는 작업이 제한될 수 있습니다.

  • 트랜잭션에서 액세스하는 모든 데이터는 최대 25개의 항목 그룹에만 포함될 수 있습니다.
  • 트랜잭션 내에서 쿼리를 사용하려면 올바른 데이터에 일치하는 상위 필터를 지정할 수 있는 방식으로 데이터가 항목 그룹으로 구성되어 있어야 합니다.
  • 단일 항목 그룹 내에서는 쓰기 처리량 한도가 초당 약 1개의 트랜잭션으로 제한되어 있습니다. 이 한도가 존재하는 이유는 Cloud Datastore가 높은 안정성과 내결함성을 제공하기 위해 광범위한 지리적 영역에 걸쳐 각 항목 그룹의 마스터 없는 동기 복제 작업을 수행하기 때문입니다.

많은 애플리케이션에서 관련성이 없는 데이터를 포괄적으로 확인할 때는 약간 오래된 데이터를 반환할 수도 있는 여러 항목 그룹에 걸친 비상위 쿼리와 같은 최종 일관성을 사용하고, 관련성이 높은 단일 데이터 세트를 보거나 편집할 때는 상위 쿼리 또는 단일 항목의 get과 같은 강력한 일관성을 사용하는 것이 적합할 수 있습니다. 이러한 애플리케이션에서는 일반적으로 관련성이 높은 데이터의 각 집합마다 별도의 항목 그룹을 사용하는 방식이 바람직합니다. 자세한 내용은 강력한 일관성을 위한 구성을 참조하세요.

속성 및 값 유형

항목과 연관된 데이터 값은 하나 이상의 속성으로 구성됩니다. 각 속성에는 이름과 하나 이상의 값이 있습니다. 속성에는 둘 이상의 유형 값이 있을 수 있으며, 두 개의 항목에 동일한 속성의 서로 다른 유형 값이 있을 수 있습니다. 속성을 색인화하거나 색인화하지 않을 수 있습니다(속성 P에서 정렬 또는 필터링되는 쿼리는 P가 색인화되지 않은 항목을 무시함). 항목은 최대 20,000개의 색인 생성된 속성을 포함할 수 있습니다.

다음 값 유형이 지원됩니다.

값 유형 Python 유형 정렬 순서 참고
정수 int
long
숫자 부호 있는 64비트 정수
부동 소수점 수 float 숫자 64비트 배정밀도,
IEEE 754
부울 bool False < True
텍스트 문자열(short) str
unicode
유니코드
(str이 ASCII로 처리됨)
최대 1500바이트
텍스트 문자열(long) db.Text 없음 최대 1MB

색인이 생성되지 않음
바이트 문자열(short) db.ByteString 바이트순 최대 1500바이트
바이트 문자열(long) db.Blob 없음 최대 1MB

색인이 생성되지 않음
날짜 및 시간 datetime.date
datetime.time
datetime.datetime
시간순
지리적 지점 db.GeoPt 위도별
이후 경도별
우편 주소 db.PostalAddress 유니코드
전화 번호 db.PhoneNumber 유니코드
이메일 주소 db.Email 유니코드
Google 계정 사용자 users.User 이메일 주소
유니코드순
인스턴트 메시징 처리 db.IM 유니코드
링크 db.Link 유니코드
카테고리 db.Category 유니코드
평점 db.Rating 숫자
Cloud Datastore 키 db.Key 경로 요소별
(종류, 식별자,
종류, 식별자...)
Blobstore 키 blobstore.BlobKey 바이트순
Null NoneType 없음

중요: UserProperty에는 이메일 주소와 사용자의 고유 ID가 포함되어 있기 때문에 저장하지 않는 것이 좋습니다. 사용자가 이메일 주소를 변경한 경우 이전에 저장된 User 값과 새로운 User 값을 비교하면 서로 일치하지 않습니다.

텍스트 문자열 및 인코딩되지 않은 바이너리 데이터(바이트 문자열)에 대해 Cloud Datastore는 두 가지 값 유형을 지원합니다.

  • short 문자열(최대 1500바이트)은 색인이 생성되고 쿼리 필터 조건 및 정렬 순서에 사용될 수 있습니다.
  • long 문자열(최대 1MB)은 색인이 생성되지 않고 쿼리 필터 및 정렬 순서에 사용될 수 없습니다.
참고: long 바이트 문자열 유형은 Cloud Datastore API에서 이름이 Blob으로 지정됩니다. 이 유형은 Blobstore API에서 사용되는 blob과 관계가 없습니다.

쿼리에 혼합된 유형 값이 있는 속성이 포함된 경우 Cloud Datastore에서는 내부 표현을 기준으로 확정된 순서를 사용합니다.

  1. Null 값
  2. 고정 소수점 수
    • 정수
    • 날짜 및 시간
    • 등급
  3. 부울 값
  4. 바이트 시퀀스
    • 바이트 문자열
    • 유니코드 문자열
    • Blobstore 키
  5. 부동 소수점 수
  6. 지리적 지점
  7. Google 계정 사용자
  8. Cloud Datastore 키

long 텍스트 문자열 및 long 바이트 문자열은 색인이 생성되지 않기 때문에 순서가 정의되지 않습니다.

항목 작업

애플리케이션에서는 Cloud Datastore API를 사용하여 항목을 생성, 검색, 업데이트, 삭제할 수 있습니다. 애플리케이션이 항목의 전체 키를 알고 있거나 상위 키, 종류, 식별자에서 파생시킬 수 있는 경우 해당 키를 사용하여 항목에서 직접 작동할 수 있습니다. 또한 애플리케이션이 Cloud Datastore 쿼리 결과로 항목 키를 가져올 수 있습니다. 자세한 내용은 Datastore 쿼리 페이지를 참조하세요.

항목 생성

Python에서는 모델 클래스의 인스턴스를 생성하고, 필요에 따라 해당 속성을 채우고, 이를 Datastore에 저장하기 위해 해당 put() 메소드를 호출하여 새 항목을 만듭니다. 항목의 키 이름을 지정하려면 생성자에 key_name 인수를 전달하면 됩니다.

employee = Employee(key_name='asalieri',
                    first_name='Antonio',
                    last_name='Salieri')

employee.hire_date = datetime.datetime.now().date()
employee.attended_hr_training = True

employee.put()

키 이름을 제공하지 않으면 Cloud Datastore가 해당 항목 키의 숫자 ID를 자동으로 생성합니다.

employee = Employee(first_name='Antonio',
                    last_name='Salieri')

employee.hire_date = datetime.datetime.now().date()
employee.attended_hr_training = True

employee.put()

항목 검색

지정된 키로 식별되는 항목을 검색하려면 Key 객체를 db.get() 함수의 인수로 전달합니다. 클래스 메소드 Key.from_path()를 사용하여 Key 객체를 생성할 수 있습니다. 전체 경로는 상위 경로에 있는 항목 시퀀스이며, 각 항목은 해당 종류(문자열)와 해당 식별자(키 이름 또는 숫자 ID)로 표시됩니다.

address_k = db.Key.from_path('Employee', 'asalieri', 'Address', 1)
address = db.get(address_k)

db.get()은 적합한 모델 클래스의 인스턴스를 반환합니다. 검색 중인 항목의 모델 클래스를 가져왔는지 확인하세요.

항목 업데이트

기존 항목을 업데이트하려면 객체의 속성을 수정한 후 해당 put() 메소드를 호출합니다. 이렇게 하면 객체 데이터가 기존 항목을 덮어씁니다. put()을 호출할 때마다 전체 객체가 Cloud Datastore로 전송됩니다.

속성을 삭제하려면 Python 객체에서 속성을 삭제합니다.

del address.postal_code

그런 다음 객체를 저장합니다.

항목 삭제

항목 키가 제공되면 db.delete() 함수를 사용하여 항목을 삭제할 수 있습니다.

address_k = db.Key.from_path('Employee', 'asalieri', 'Address', 1)
db.delete(address_k)

또는 항목의 고유 delete() 메소드를 호출할 수 있습니다.

employee_k = db.Key.from_path('Employee', 'asalieri')
employee = db.get(employee_k)

# ...

employee.delete()

일괄 작업

db.put(), db.get(), db.delete() 함수(및 해당 비동기 상대 함수 db.put_async(), db.get_async(), db.delete_async())는 목록 인수를 사용하여 단일 Cloud Datastore 호출의 여러 항목에서 작업을 수행할 수 있습니다.

# A batch put.
db.put([e1, e2, e3])

# A batch get.
entities = db.get([k1, k2, k3])

# A batch delete.
db.delete([k1, k2, k3])

일괄 작업을 수행해도 비용에 변화는 없습니다. 각 키가 있는지 여부와 관계없이 일괄 처리된 작업에서 모든 키에 요금이 부과됩니다. 작업과 관련된 항목의 크기는 비용에 영향을 주지 않습니다.

대량 항목 삭제

다량의 항목을 삭제해야 한다면 Cloud Dataflow를 사용하여 항목을 대량으로 삭제하는 것이 좋습니다.

빈 목록 사용

NDB 인터페이스에서 Cloud Datastore는 지금까지 정적 및 동적 속성 모두에 대해 빈 목록을 생략된 속성으로 작성했습니다. 하위 호환성 유지를 위해 이 동작은 계속 기본적으로 적용됩니다. 이를 전역으로 또는 ListProperty별 기준에 따라 재정의하기 위해서는 속성 클래스에서 write_empty_list 인수를 true로 설정합니다. 그러면 빈 목록이 Cloud Datastore에 작성되고 빈 목록으로 읽혀질 수 있습니다.

DB 인터페이스의 경우 빈 목록 쓰기는 속성이 동적인 경우 지금까지 전혀 허용되지 않았으며, 이를 시도하면 오류가 발생했습니다. 즉, DB 동적 속성의 경우 하위 호환성을 위해 보존해야 할 기본 동작이 없습니다. 따라서 동적 모델에서는 특별한 변경사항 없이도 단순히 빈 목록을 쓰고 읽을 수 있습니다.

하지만 DB 정적 속성의 경우에는 빈 목록이 생략된 속성으로 작성되었습니다. 이 동작은 하위 호환성을 위해 계속 유지됩니다. DB 정적 속성에 빈 목록을 설정하기 위해서는 해당 속성 클래스에서 write_empty_list 인수를 true로 사용합니다. 그러면 빈 목록이 Cloud Datastore에 작성됩니다.

쓰기 비용 이해

애플리케이션에서 Cloud Datastore put 작업을 수행할 때, Cloud Datastore는 항목을 저장하기 위해 여러 번의 쓰기를 수행해야 합니다. 애플리케이션에서 이러한 쓰기 작업은 각각의 작업에 대해 비용이 청구됩니다. SDK 개발용 콘솔의 데이터 뷰어를 보면 항목을 저장하기 위해 필요한 쓰기 작업 횟수를 확인할 수 있습니다. 이 섹션에서는 이러한 쓰기 비용의 계산 방법을 설명합니다.

모든 항목을 저장하기 위해서는 최소한 두 번의 쓰기가 필요합니다. 한 번은 항목 자체를 쓰기 위한 것이고, 다른 한 번은 내장된 EntitiesByKind 색인을 쓰기 위한 것입니다. 이러한 색인 쓰기는 쿼리 플래너가 여러 쿼리를 지원하기 위해 사용됩니다. 또한 Cloud Datastore에는 두 가지 다른 내장 색인인 EntitiesByPropertyEntitiesByPropertyDesc가 사용됩니다. 이것들은 단일 속성 값을 오름차순 및 내림차순으로 표시하여 항목을 효율적으로 검색할 수 있게 해줍니다. 항목에서 색인 생성된 각 속성 값을 이러한 각 색인에 기록해야 합니다.

예를 들어 다음과 같이 A, B, C 속성이 포함된 항목이 있다고 가정해보세요.

Key: 'Foo:1' (kind = 'Foo', id = 1, no parent)
A: 1, 2
B: null
C: 'this', 'that', 'theOther'

이 종류의 항목에 대해 복합 색인이 없다고 가정하면(아래 참조), 이 항목을 저장하기 위해 14번의 쓰기가 필요합니다.

  • 항목 자체를 위한 1번의 쓰기
  • EntitiesByKind 색인을 위한 1번의 쓰기
  • A 속성을 위한 4번의 쓰기(2개의 각 값에 대해 2회씩)
  • B 속성을 위한 2번의 쓰기(null 값도 쓰기 필요)
  • C 속성을 위한 6번의 쓰기(3개의 각 값에 대해 2회씩)

복합 색인(다중 속성이라고도 부름)은 유지 관리를 위해 추가적인 쓰기가 필요합니다. 다음과 같은 복합 색인을 정의한다고 가정해보세요.

Kind: 'Foo'
A ▲, B ▼

여기서 삼각형은 지정된 속성의 정렬 순서를 나타냅니다. A 속성은 오름차순을 나타내고 B 속성은 내림차순을 나타냅니다. 위에 정의된 항목을 정렬하면 AB 값의 각 조합에 대해 복합 색인에 쓰기가 추가로 수행됩니다.

(1, null) (2, null)

이렇게 하면 복합 색인에 2번의 쓰기가 추가되어 총 1 + 1 + 4 + 2 + 6 + 2 = 16번의 쓰기가 수행됩니다. 이제 이 색인에 C 속성을 추가하면 다음과 같이 됩니다.

Kind: 'Foo'
A ▲, B ▼, C ▼

동일한 항목을 저장하기 위해 이제는 A, B, C 값의 가능한 각 조합에 대해 복합 색인에 대한 쓰기가 필요합니다.

(1, null, 'this') (1, null, 'that') (1, null, 'theOther')

(2, null, 'this') (2, null, 'that') (2, null, 'theOther')

따라서 총 1 + 1 + 4 + 2 + 6 + 6 = 20번의 쓰기가 필요합니다.

Cloud Datastore 항목에 여러 다중 값 속성이 포함되었거나, 단일 속성이 여러 번 참조되는 경우 색인을 유지 관리하기 위해 필요한 쓰기 횟수가 조합에 따라 폭발적으로 증가할 수 있습니다. 이러한 색인 폭발은 유지 비용이 매우 높을 수 있습니다. 예를 들어 상위 항목이 포함된 복합 색인을 고려해보세요.

Kind: 'Foo'
A ▲, B ▼, C ▼
Ancestor: True

이 색인이 포함된 간단한 항목은 위와 동일한 횟수의 쓰기가 수행됩니다. 하지만 항목에 상위 항목이 포함되어 있으면, 항목 자체에 대한 조합 외에도 속성 값과 상위 항목의 가능한 조합에 대한 쓰기가 필요합니다. 따라서 항목이 다음과 같이 정의된 경우

Key: 'GreatGrandpa:1/Grandpa:1/Dad:1/Foo:1' (kind = 'Foo', id = 1, parent = 'GreatGrandpa:1/Grandpa:1/Dad:1')
A: 1, 2
B: null
C: 'this', 'that', 'theOther'

속성 및 상위 항목에 가능한 다음 조합에 따라 복합 색인에 대한 쓰기가 필요합니다.

(1, null, 'this', 'GreatGrandpa') (1, null, 'this', 'Grandpa') (1, null, 'this', 'Dad') (1, null, 'this', 'Foo')

(1, null, 'that', 'GreatGrandpa') (1, null, 'that', 'Grandpa') (1, null, 'that', 'Dad') (1, null, 'that', 'Foo')

(1, null, 'theOther', 'GreatGrandpa') (1, null, 'theOther', 'Grandpa') (1, null, 'theOther', 'Dad') (1, null, 'theOther', 'Foo')

(2, null, 'this', 'GreatGrandpa') (2, null, 'this', 'Grandpa') (2, null, 'this', 'Dad') (2, null, 'this', 'Foo')

(2, null, 'that', 'GreatGrandpa') (2, null, 'that', 'Grandpa') (2, null, 'that', 'Dad') (2, null, 'that', 'Foo')

(2, null, 'theOther', 'GreatGrandpa') (2, null, 'theOther', 'Grandpa') (2, null, 'theOther', 'Dad') (2, null, 'theOther', 'Foo')

이 항목을 Cloud Datastore에 저장하기 위해서는 총 1 + 1 + 4 + 2 + 6 + 24 = 38번의 쓰기가 필요합니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

App Engine standard environment for Python 2