항목 키 만들기 및 사용

각 항목은 애플리케이션의 Datastore 인스턴스 내에서 고유한 키로 식별되며 다음으로 구성됩니다.

  • 종류. 종류는 일반적으로 항목이 속한 모델 클래스의 이름이지만 _get_kind() 클래스 메서드를 재정의하여 다른 문자열로 변경할 수 있습니다.
  • 식별자. 고유한 키 이름을 식별자로 지정하거나 Datastore가 자동으로 정수로 된 숫자 ID를 생성하도록 허용합니다.

고유한 키 이름 지정

다음 예시에서는 이름이 지정된 매개변수 id를 사용하여 암시적으로 문자열 식별자가 있는 키를 만듭니다.

account = Account(
    username='Sandy', userid=1234, email='sandy@example.com',
    id='sandy@example.com')

return account.key.id()  # returns 'sandy@example.com'

또는 키 이름을 직접 설정할 수도 있습니다.

account.key = ndb.Key('Account', 'sandy@example.com')

# You can also use the model class object itself, rather than its name,
# to specify the entity's kind:
account.key = ndb.Key(Account, 'sandy@example.com')

Datastore에서 키에 사용할 ID를 생성하도록 허용

다음 코드는 자동 생성된 ID를 키로 사용하는 방법을 보여줍니다.

# note: no id kwarg
account = Account(username='Sandy', userid=1234, email='sandy@example.com')
account.put()
# account.key will now have a key of the form: ndb.Key(Account, 71321839)
# where the value 71321839 was generated by Datastore for us.

키에서 상위 경로 사용

루트 항목으로 시작해서 상위에서 하위로 진행되고, 제공된 항목으로 이어지는 항목 시퀀스에 따라 항목의 상위 경로가 구성됩니다. 항목, 항목의 상위, 상위의 상위 등이 재귀적으로 항목의 상위가 됩니다. Datastore의 항목은 파일 시스템의 계층적 디렉터리 구조와 유사한 계층적 키 공간을 형성합니다.

항목을 식별하는 전체 키는 상위 경로를 지정하고 항목 자체로 끝나는 종류-식별자 쌍의 시퀀스로 구성됩니다. Key 클래스의 생성자 메서드는 이러한 종류와 식별자 시퀀스를 수락하고 해당 항목의 키를 나타내는 객체를 반환합니다.

다음 예는 메시지를 버전별로 저장하는 블로깅 서비스를 보여줍니다. 메시지는 계정 아래에 구성되며, 버전은 메시지 아래에 구성됩니다.

class Revision(ndb.Model):
    message_text = ndb.StringProperty()
...
ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')
ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '2')
ndb.Key('Account', 'larry@example.com', 'Message', 456, 'Revision', '1')
ndb.Key('Account', 'larry@example.com', 'Message', 789, 'Revision', '2')

이 샘플에서 ('Account', 'sandy@example.com'), ('Message', 123), ('Revision', '1')은 모두 종류-식별자 쌍의 예시입니다.

Message는 모델 클래스가 아닙니다. 데이터를 저장하기 위해서가 아니라 버전을 그룹화하는 방법으로만 사용됩니다.

샘플 코드에서 본 것처럼 항목 종류는 마지막 종류-이름 쌍에 의해 지정됩니다(ndb.Key('Revision', '1')).

명명된 매개변수 사용

이름이 지정된 매개변수 parent를 사용하여 상위 경로의 항목을 직접 지정할 수 있습니다. 다음 표기법은 모두 동일한 키를 나타냅니다.

ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')

ndb.Key('Revision', '1', parent=ndb.Key(
    'Account', 'sandy@example.com', 'Message', 123))

ndb.Key('Revision', '1', parent=ndb.Key(
    'Message', 123, parent=ndb.Key('Account', 'sandy@example.com')))

루트 항목 지정

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

sandy_key = ndb.Key(Account, 'sandy@example.com')

상위 항목이 있는 항목 지정

상위 키가 있는 새 메시지를 삽입하는 코드는 다음과 같습니다.

account_key = ndb.Key(Account, 'sandy@example.com')

# Ask Datastore to allocate an ID.
new_id = ndb.Model.allocate_ids(size=1, parent=account_key)[0]

# Datastore returns us an integer ID that we can use to create the message
# key
message_key = ndb.Key('Message', new_id, parent=account_key)

# Now we can put the message into Datastore
initial_revision = Revision(
    message_text='Hello', id='1', parent=message_key)
initial_revision.put()

상위 항목과 함께 키가 생성되면 parent() 메서드가 상위 항목을 나타내는 키를 반환합니다.

message_key = initial_revision.key.parent()

숫자 키 ID 사용

ID를 지정하지 않고 항목을 만들 수 있으며, 이 경우 데이터 스토어는 자동으로 숫자 ID를 생성합니다. 일부 ID를 지정한 후 Datastore가 자동으로 일부 ID를 생성하도록 선택하면 고유 키 요구 사항에 어긋날 수 있습니다. 이를 방지하려면 ID 선택 시 사용할 숫자 범위를 예약하세요. 또는 문자열 ID를 사용하면 이 문제를 완전히 방지할 수 있습니다.

ID 범위를 예약하려면 모델 클래스의 allocate_ids() 메서드를 사용하여 다음을 수행합니다.

  • 지정된 수의 ID를 할당합니다.
  • 모든 ID를 지정된 최대 값까지 할당합니다.

ID 할당

지정된 모델 클래스 MyModel에 100개의 ID를 할당하는 코드는 다음과 같습니다.

first, last = MyModel.allocate_ids(100)

상위 키 p가 있는 항목에 100개의 ID를 할당하는 코드는 다음과 같습니다.

first, last = MyModel.allocate_ids(100, parent=p)

반환된 firstlast 값은 할당된 첫 번째 ID와 마지막 ID입니다(경계 포함). 이 값을 사용하여 다음과 같이 키를 생성할 수 있습니다.

keys = [ndb.Key(MyModel, id) for id in range(first, last+1)]

이러한 키는 데이터 저장소의 내부 ID 생성기에서 이전에 반환된 적이 없고 이후 내부 ID 생성기를 호출할 때 반환되지 않을 것이라고 보장됩니다. 하지만 allocate_ids() 메서드는 반환된 ID가 데이터 스토어에 있는지 여부를 확인하지 않으며 ID 생성기와만 상호 작용합니다.

모든 ID를 지정된 최대값까지 할당하는 코드는 다음과 같습니다.

first, last = MyModel.allocate_ids(max=N)

이 형태는 N보다 작거나 같은 모든 ID가 할당된 것으로 간주합니다. 반환된 firstlast 값은 이 작업으로 예약된 ID 범위를 나타냅니다. 이미 할당된 ID를 예약하려고 시도하는 것은 오류가 아닙니다. 그렇게 하면 first는 아직 할당되지 않은 최초의 ID를 나타내고 last는 할당된 마지막 ID가 됩니다.