-1

파이썬 ndb 사용과 관련하여 몇 가지 의문점이 있습니다. proto 데이터 저장소를 사용하고 있습니다. 클래스가 있습니다. 사용자파이썬 ndb에서 고유 한 사용자 이름

class User(EndpointsModel): 
    name = ndb.StructuredProperty(Name, required=True) 
    dateOfBirth = ndb.DateProperty(required=True) 
    userName = ndb.StringProperty(required=True) 
    emailId = ndb.StringProperty(required=True) 

사용자 이름을 기반으로 사용자 엔티티를 가져 오려고합니다. 새 사용자 개체를 만들고 수행 할 때

user.id = username 

"ID는 정수 여야합니다."라는 오류 메시지가 나타납니다. 어떻게이를 극복합니까? 또한 user.get_by_id()는 보다 빠릅니다. User.query (User.username == username)?

나는 모든 사용자 이름이 고유하기를 원한다면 사용자 이름의 엔티티를 생성하고 새로운 사용자가 이미 존재하거나 또는이를 수행 할 수있는 다른 깔끔하고 효율적인 방법이있을 때마다 확인해야합니다.

답변

4

엔티티의 고유 키가 사용자 이름에서 포함하고 복제 할 수 있기를 원하는 것처럼 들리지만 일반적으로 유용합니다.

는 ID가 생성자를 호출 할 때 설정해야합니다 특정 ID를 가진 사용자 개체를 만들려면 :

username = 'foo' 
user = User(id=username) 
user.put() 

이 키는 하나 개의 경로 부분을 가지고 키 User: foo하는 새로운 엔티티 객체를 (구축 종류 이름은 User이고 문자열 ID는 foo입니다. put() 호출은이를 데이터 스토어에 저장합니다.

get()하려고 주어진 이름에 대한 개체를 얻을 Key를 구성하는 데 :

key = ndb.Key('User', username) 
user = key.get() 
if not user: 
    # .... 

그렇지 않은 경우 주어진 이름에 대한 User 법인을 만들어 함께 다음을 넣어하는 것이 일반적이다

key = ndb.Key('User', username) 
user = key.get() 
if not user: 
    user = User(id=username) 
    user.put() 

권장 연습을하는 데이터 저장소 트랜잭션 내에서이 작업을 수행하는 것입니다, 그래서 두 클라이언트가 동일한 사용자 이름 돈 '에 대한 첫 번째 User 개체를 만들려고 : 존재 그것을 모른 채 서로 마주 친다.

키에 사용자 이름을 넣으면 고유성이 보장됩니다. 그리고 네, 속성에 의해 쿼리하는 것보다 키를 얻는 것이 더 빠릅니다. 쿼리에는 키 목록으로 결과를 얻는 여러 단계가 포함되어 결과가 하나만있는 경우에도 결과 엔터티를 가져옵니다. 다른 종류의 쿼리를 위해 필요할 경우에 대비해 인덱스 된 속성으로 사용자 이름을 저장하고 싶지만 엔티티를 가져 오거나 존재 확인을하는 것만으로도 키가 작동합니다.

+1

'username'을 키로 설정하는 문제 중 하나는 생성 후 사용자 이름을 변경할 수 없다는 것입니다 ... 요청 당 처리가 완료 되더라도 대부분의 시간이 필요합니다. – Lipis

+1

공정한 점. 요구 사항 인 경우 독창성 요구 사항은 다소 어려워집니다. 트랜잭션마다 사용자 이름을 예약 할 수 있도록 엔티티 당 하나의 사용자 이름을 포함하는 큰 엔티티 그룹이 필요할 수 있습니다. (모든 'User'엔티티를 단일 엔티티 그룹에 두는 것은 바람직하지 않을 수 있습니다.) 그룹 간 트랜잭션은 사용자 생성 및 이름 변경에 유용합니다. 이 레이아웃을 사용하면 사용자 이름에서 사용자 ID를 찾는 검색어가 가장 좋은 옵션 일 수 있으며 드물게 (예 : 로그인 할 때 한 번만) 수행하면 비용이 많이 들지 않습니다. –

+0

위의 방법을 사용하면 특정 사용자 이름으로 한 명의 사용자 만있을 수 있지만 새 사용자를 추가 할 때 다른 사용자가이 사용자 이름을 가지고 있는지 확인해야합니다. 그렇지 않으면 사용자의 데이터 멤버를 업데이트합니다. –

0

정확하게 사용자 인스턴스를 어떻게 만듭니 까?

newUser = User(id=your_id) 

당신은, 그것은 작동하지 않습니다 전혀 newUser.id를 사용할 필요가 없습니다 이렇게하는 올바른 방법은 말을하는 것입니다. 기존 ID로 새 사용자를 만들면 데이터베이스에서 이전 ID로 바뀝니다. 사용한 ID를 추적하거나 다른 상위 키를 제공하는 방법을 찾아야합니다.이 경우 부모가 다른 경우 ID를 복제 할 수 있습니다.

두 번째 질문에 대해서는 get_by_id() 클래스를 읽었으며 실제로는 쿼리를 사용한다는 것입니다.그러나 쿼리를 직접 사용하려면 1 인스턴스를 가져와 목록에서 첫 번째 요소를 가져와야합니다. fetch() (User.query().fetch(1)[0]). get_by_id()을 사용하는 것이 훨씬 쉬우 며 키가있는 경우 key.get()을 사용하십시오.