항목 만들기, 검색, 업데이트, 삭제

Datastore의 데이터 객체를 항목이라고 하며, 각 항목은 쿼리를 위해 특정한 종류로 분류됩니다. 예를 들어 인사 관리 애플리케이션을 작성하는 경우 각 직원을 Employee 종류의 항목으로 나타낼 수 있습니다. 항목 데이터 값 형태는 속성이라는 점에 유의하세요. 항목에 대한 자세한 내용은 상위 경로트랜잭션 문서를 참조하세요.

항목 만들기 및 속성 설정

모델 클래스에 대한 생성자 메소드를 호출하여 항목을 만들고 설정합니다. 항목 모델 클래스 만들기에 대한 자세한 내용은 항목 모델 클래스 만들기 및 사용을 참조하세요.

다음 예에서는 키워드 인수를 사용하여 모델 클래스 생성자를 호출하는 방법을 보여줍니다.

sandy = Account(
    username='Sandy', userid=123, email='sandy@example.com')

이 코드는 프로그램의 주 메모리에 객체를 만듭니다. 그러나 항목은 프로세스가 종료될 때 사라지므로 다음과 같이 put()을 호출하여 항목을 Datastore에도 유지해야 합니다.

sandy_key = sandy.put()

그러면 나중에 Datastore에서 항목 검색에 사용할 수 있는 키가 반환됩니다.

다음 옵션 중 하나를 사용하여 속성을 설정하세요.

  • 키워드 인수를 사용하여 생성자에 대한 항목 속성을 지정합니다.
    sandy = Account(
        username='Sandy', userid=123, email='sandy@example.com')
  • 항목을 생성한 후에 속성을 수동으로 설정합니다.
    sandy = Account()
    sandy.username = 'Sandy'
    sandy.userid = 123
    sandy.email = 'sandy@example.com'
  • populate() 편의 메서드를 사용하여 작업 한 번으로 여러 속성을 설정합니다.
    sandy = Account()
    sandy.populate(
        username='Sandy',
        userid=123,
        email='sandy@gmail.com')

하지만 항목 속성을 설정하면 속성 유형(이 경우 StringPropertyIntegerProperty)이 유형 확인을 적용합니다.

예를 들면 다음과 같습니다.

bad = Account(
    username='Sandy', userid='not integer')  # raises an exception
...
sandy.username = 42  # raises an exception

키에서 항목 검색

항목 키가 있는 경우 Datastore에서 항목을 가져올 수 있습니다.

sandy = sandy_key.get()

키 메서드 kind()id()는 키에서 항목의 종류와 식별자를 복구합니다.

kind_string = sandy_key.kind()  # returns 'Account'
ident = sandy_key.id()  # returns '2'

또한 항목 키를 사용하여 URL에 삽입하기에 적합한 인코딩된 문자열을 가져올 수도 있습니다.

url_string = sandy_key.urlsafe()

agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM과 같은 결과가 생성되고 나중에 키를 재구성하고 원본 항목을 검색하는 데 사용될 수 있습니다.

sandy_key = ndb.Key(urlsafe=url_string)
sandy = sandy_key.get()

URL 안전 문자열은 비밀스러워 보이지만 암호화되어 있지는 않습니다. 간편하게 디코딩하여 원래 항목의 종류 및 식별자를 복구할 수 있습니다.

key = Key(urlsafe=url_string)
kind_string = key.kind()
ident = key.id()

이러한 URL 안전 키를 사용하는 경우, 이메일 주소와 같은 민감한 정보를 항목 식별자로 사용하지 마세요. 한 가지 해결책은 민감한 정보의 해시를 식별자로 사용하는 것입니다. 이렇게 하면 암호화된 키를 볼 수 있는 제3자가 알려진 이메일 주소의 해시를 독립적으로 생성 및 사용하여 이 주소가 Datastore에 있는지 확인하는 것을 중지할 수는 없지만 암호화된 키를 사용하여 이메일 주소를 수집하지 못하게 합니다.

항목 업데이트

기존 항목을 업데이트하려면 Datastore에서 항목을 검색하고 속성을 수정한 후 다시 저장합니다.

sandy = key.get()
sandy.email = 'sandy@example.co.uk'
sandy.put()

항목 키는 업데이트할 때 변경되지 않으므로 이 경우 put()에서 반환하는 값을 무시할 수 있습니다.

항목 삭제

키의 delete() 메서드를 사용하여 더 이상 필요 없는 항목을 Datastore에서 삭제할 수 있습니다.

sandy.key.delete()

이 작업은 항목 자체에 대한 작업이 아니라 키에 대한 작업입니다. 항상 None을 반환합니다.

대량 항목 삭제

다수의 항목을 삭제해야 하는 경우 Dataflow를 사용하여 항목을 일괄 삭제하는 것이 좋습니다.

일괄 작업 사용

항목 또는 키 컬렉션을 별도의 호출에서 개별적으로 처리(예: 루프 내부)하지 않고 단일 호출에서 처리할 수 있습니다. 이렇게 하면 항목마다 별도의 리모트 프로시져 콜(RPC)이 아니라 배치에 대한 단일 RPC가 이루어집니다.

다음 코드는 이 작업을 수행하는 방법을 보여줍니다.

list_of_keys = ndb.put_multi(list_of_entities)
list_of_entities = ndb.get_multi(list_of_keys)
ndb.delete_multi(list_of_keys)

위 코드에서는 키 객체 목록을 ndb.get_multi에 전달하여 한 번에 항목 여러 개를 가져옵니다. Cloud Datastore에 해당 항목이 없는 키의 경우 ndb.get_multiNone 값을 포함하여 항목 객체의 목록을 반환합니다. 이러한 방식으로 항목을 가져오면 전체 배치에서 Datastore에 대한 호출 횟수가 줄어듭니다. (배치당 호출 횟수는 배치 크기 설정에 따라 다릅니다.)