용 엔진 데이터 저장소에서 연산자를 사용하는 방법?
-
05-07-2019 - |
문제
읽기: http://code.google.com/appengine/docs/python/datastore/gqlreference.html
내가 사용하려면:
:=에
하지만 어떻게 작동합니다.가정하자 다음
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')
어떻게 할 수 있습니 쿼리를 가져오는 나의 목록을 저장한 항목에 대한 사용자가?분명히 내가 할 수 있습니다:
q = db.Gql("SELECT * FROM UserListOfSavedItems WHERE name :=", user[0].name)
하지만 가져오는 나의 목록을 키를 사용합니다.고 싶어 이제는 목록에 그것을 얻을 쿼리를 얻을 수 str 분야의 UniqueListOfSavedItems.나는 생각을 할 수 있습니다.
q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems WHERE := str in q")
하지만 뭔가가 바로...어떤 아이디어가?그것은(이에 제일 작업,그래서 테스트 할 수 없습니다 이제):
q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems __key__ := str in q)
side note:what 지독하게 어려운 문제에서 검색하기 때문에 모든 내가 정말 걱정"에서"연산자입니다.
해결책
때문에 당신의 목록을 가지고,당신을 할 필요가 없이 두 번째는 쿼리를 할 수 있는 배치를 가져옵니다.이것을 보십시오:
#and this should get me the items that a user saved
useritems = db.get(saveditemkeys)
(참고도 필요하지 않은 경비 절-db.에 0 체 단락 appropritely.)
의 차이점은 무엇일까요?론,db.을 얻을은 약 20-40ms.쿼리,다른 한편으로는(GQL 또는지)약 160-200ms.하지만 잠시,그것은 더 나빠!에서는 운전자를 구현에서는 Python 및 변환하는 여러 쿼리는 직렬로 실행됩니다.그래서 당신이 할 경우 쿼리에 대한 필터 10 키,당신이 하고 있는 10 개의 160ms-틱 쿼리 작업,총 약 1.6 초 대기 시간이 길어집니다.단일 db.을 얻을 대조적으로,동일한 영향을 미칠 것입니다 및에 대한 총 30ms.
다른 팁
+1 이 아담을 얻기 위해 나에게 오른쪽에는 트랙에 있습니다.에 따라 자신의 포인터,그리고 일부에서 검색드 검색,나는 다음과 같은 솔루션입니다.
usersaveditems = User.Gql(“Select * from UserListOfSavedItems where user =:1”, userkey)
saveditemkeys = []
for item in usersaveditems:
#this should create a list of keys (references) to the saved item table
saveditemkeys.append(item.str())
if len(usersavedsearches > 0):
#and this should get me the items that a user saved
useritems = db.Gql(“SELECT * FROM UniqueListOfSavedItems WHERE __key__ in :1’, saveditemkeys)