2012-12-17 3 views
1

여기에 필자의 딜레마가있다. 반복되는 일부 속성 (NDB를 사용하고 있음)이 비어 있는지 확인하는 엔티티 목록을 검토해야한다. 그렇다면 put()에 값을 지정합니다. 그렇지 않으면 엔티티를 건너 뜁니다. 나는 Google 애플 리케이션 엔진과 함께 제공되는 원격 로그인 셸에서이 모든 작업을 수행하려고합니다.Google App Engine의 remote_api_shell.py에서 엔터티를 가져오고 쓰는 중 오류가 발생했습니다.

나는 조건부를 수행하고 값을 쓰는 Model.query()를 반복적으로 시도했지만 프로세스를 작성하기 시작할 때 끊어진다. 마지막으로 Ctrl-C를 누르면 "assert response.set_status_size() == len (server_keys); AssertionError"라는 오류 메시지가 나타납니다. 나는 이것이 검색하려고하는 엔티티의 크기와 관련이 있다고 가정하고 있습니다. 누구나 무슨 일인 줄 알아? 여기에 내 현재 코드입니다 : 난 그냥 if 문을 사용하는 대신 쿼리를 필터링 할

>>> for entity in Model.query(): 
... if not len(entity.references): 
...  entity.references = somevalue 
...  continue 
... print 'skipped' 

하지만 반복되는 속성의 길이에 따라 쿼리를 필터링하는 방법을 모르겠어요.

답변

1

코드 샘플은 참조가없는 첫 번째 엔터티를 찾거나 아무 것도 참조하지 않고 일부 엔터티를 남겨 둘 수 있지만 참조가없는 경우 skipped을 인쇄하면 반환됩니다. 그것이 당신이 의도 한 것이 었는지 나는 모른다.

예를 들어, [ 'python', 'ruby', 'php']와 같은 참조가 가능한 경우, Model.query(Model.references.IN(['python', 'ruby', 'php'])))과 같은 검색어를 사용하면 Repeated Properties과 같은 검색어를 사용할 수 있다고 생각합니다. 모든 엔터티를 검색하고 나머지 엔터티를 반복합니다. (NDB에 대해 많이 알지는 못하지만 일반적으로 좋은 방법이 될지는 모르겠지만 일부 데이터 세트에서는 정상적으로 작동 할 것입니다.)

+0

웁스! 나는 계속하기를 의미했다. 그것을 잡아 주셔서 감사합니다. 불행히도 필자의 경우 필터가 작동하지 않을 것이라고 생각합니다. – Harrison

3

보유하고있는 엔티티는 몇 개입니까? 100 개가 넘는 경우 원격 API에서 쿼리하는 것이 실제로 비효율적 (2 차적)입니다. 그래서 그걸 설명 할 수 있습니다.

찾고있는 조건을 검색하는 쿼리를 작성할 수 없다는 것은 당연합니다.

1

나는 마침내 작동했습니다! query.fetch_page을 사용하여 일괄 적으로 쿼리를 가져온 다음 각 일괄 처리를 반복하고 변경 내용을 적용했습니다.

>>> more = True 
>>> cursor = None 
>>> while more: 
...  batch, cursor, more = MyModel.query().fetch_page(50, start_cursor=cursor) 
...  for entity in batch: 
...   if not len(entity.references): 
...    entity.references = somevalue 
...    entity.put() 
...  print "finished batch"