2012-10-24 3 views
22

ndb의 메소드를 삽입하여 객체를 만들면 Key (kind, id) 유형의 키가 자동으로 생성됩니다. 여기서 id는 숫자입니다. 문서 전체에 걸쳐 키의 id에 문자열을 사용할 수 있지만 객체를 만들 때 자동으로이를 수행하는 방법을 찾을 수 없다는 것을 보여줍니다.Google App Engine NDB 맞춤 키 ID

나는 사용자 모델을 가지고 있으며 빠른 검색을 위해 키의 ID로 사용자의 사용자 이름을 사용하려고합니다. 그것도 좋은 생각입니까? 사용자가 제출했기 때문에 사용자 이름에 문제가 있습니까 (입력 확인 중입니다).

답변

30
class UserModel(ndb.Model): 
    ... 

user_model_entity = UserModel(id='some_string', ...) 

이 ID는 변경 될 수 있습니다. 자신의 시스템이고 잠재적 인 변화에 대응할 수 있다면 좋은 생각이지만 ID를 사용하기로 결정하기 전에 ID가 고유하고 상대적으로 안정적인지 확인해야합니다.

+0

답변 해 주셔서 감사합니다. 나는 그것보다 복잡하다고 생각했다. – andrei

+0

이전에이 접근 방식에 대기 시간 문제가 발생했습니다. Datastore 엔티티에 대한 ID를 수동으로 설정하는 것은 좋지 않습니다. "핫 타블렛"문제가 발생할 수도 있습니다. 데이터 저장소가 엔티티 ID를 자동으로 생성하고 키 자체에 데이터를 인코딩하지 않도록하는 것이 가장 좋습니다. 대신 엔티티에서 Property를 사용하십시오. 자동 증분 기본 키와 같은 관계형 데이터베이스 규칙을 Datastore에 적용하려고 할 수 있지만 키 공간의 샤딩을 실제로 취소하고 문제를 생성합니다. [1] https://cloud.google.com/appengine/articles/handling_datastore_errors –

13

생성시 엔티티의 ID를 지정합니다. 모델을 정의 할 때 id 속성을 설정하지 않습니다. 따라서, 예를 들어, 당신은 :

class User(ndb.Model): 
    # fields here 

당신이 모델을 만들 때, 당신이 가지고 : 사용자 이름이 고유하고 당신이 당신의 입력을 확인

user = User(id='username', ...) 

때문에, 당신이 어떤 문제가되지 않습니다 접근.

ndb Model 생성자에 대한 자세한 내용은 NDB Model Class - Constructor을 참조하십시오.

희망이 도움이됩니다.

+1

NDB 생성자를 가리켜 주셔서 감사합니다. – ggauravr

0

모델 엔티티에 정수 ID (반드시 문자열 일 필요는 없음)를 제공 할 수도 있습니다.

class User(ndb.Model): 
... 

user = User(id=1234567890, ...) 
user.put()