2009-06-16 2 views
3

읽기 : http://code.google.com/appengine/docs/python/datastore/gqlreference.htmlApp Engine Datastore 운영자 - 사용 방법은 무엇입니까?

내가 사용하려는 :

=

IN하지만 그것이 작동되도록하는 방법을 확실입니다. 의는 가정하자 다음

class User(db.Model): 
    name = db.StringProperty() 

class UniqueListOfSavedItems(db.Model): 
    str = db.StringPropery() 
    datesaved = db.DateTimeProperty() 

class UserListOfSavedItems(db.Model): 
    name = db.ReferenceProperty(User, collection='user') 
    str = db.ReferenceProperty(UniqueListOfSavedItems, collection='itemlist') 

I 사용자 나에게 저장된 항목의 목록을 가져옵니다 쿼리를 할 수 있습니까? 분명히 할 수있다 :

q = db.Gql("SELECT * FROM UserListOfSavedItems WHERE name :=", user[0].name) 

그러나 그것은 나에게 열쇠의 목록을 얻는다. 이제이 목록을 가져 와서 UniqueListOfSavedItems에서 str 필드를 가져 오는 쿼리로 가져 오려고합니다. 내가 할 수 있다고 생각 :

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems WHERE := str in q") 

하지만 뭔가 이상하지 않다 ... 어떤 아이디어? 그것이 (내 하루 직장에서 오전, 그래서 지금이 테스트 할 수 없습니다) :

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems __key__ := str in q) 

옆의 노트 : 나는 정말 걱정 모두가 "IN"연산자이기 때문에 지독하게 어려운 문제가 검색 대상.

답변

9

키 목록이 있으므로 두 번째 쿼리를 수행 할 필요가 없습니다. 대신 배치 페치를 수행 할 수 있습니다.

의 차이는 무엇, 당신은 요청할 수 있습니다 -

#and this should get me the items that a user saved 
useritems = db.get(saveditemkeys) 

. (0 엔티티에 db.get가 appropritely 단락 당신도 가드 조항을 필요가 없습니다) :이 시도? db.get은 약 20-40ms가 걸립니다. 한편, 질의는 (GQL이든 아니든간에) 약 160-200ms가 걸립니다. 그러나 기다려라, 그것은 더 나 빠진다! IN 연산자는 Python으로 구현되며 순차적으로 실행되는 여러 쿼리로 변환됩니다. 따라서 10 개의 키에 대해 IN 필터를 사용하여 쿼리를 수행하면 10 개의 별도 160ms-ish 쿼리 작업이 수행되므로 총 약 1.6 초의 대기 시간이 소요됩니다. 대조적으로 단일 db.get은 동일한 효과를 가지며 총 약 30ms가 소요됩니다.

+0

좋은 답변 ... 오늘 밤에 이것을 구현하겠습니다. 나는 코드를 작동 시켰고 (그래!) 나중에 최적화가 올 수 있었다. :) 지금 나는 정규 표현식을 사용 중입니다. 강타. 머리. 에. 건반. –

+1

Brandon - 저는 regexbuddy라는 앱을 사용합니다. 어떤 식 으로든 그들과 관련이 없습니다. –

0

Adam이 올바른 길로 나를 데려 오기 위해 +1. 그의 포인터를 기반으로 코드 검색에서 검색을 수행하면 다음과 같은 솔루션을 얻게됩니다.

관련 문제