2013-10-05 8 views
0

내 코드에 의도 없음 결과를 반환 존재하는 경우GqlQuery 항상

  • 는 쿠키에서 USER_ID를 검색합니다.
  • user_id를 사용하여 데이터 저장소를 쿼리하여 사용자 레코드를 검색하십시오.
  • 마지막으로 레코드가 있으면 환영 메시지가 표시됩니다. (가입이 템플릿으로 전달됨)

환영 메시지를 표시 할 수없는 앱입니다. 내가 알 수있는 한 문제는 쿼리가 항상 없음을 반환한다는 것입니다. 쿠키를 확인했으며 데이터 저장소의 데이터가 존재합니다.

이 쿼리는 무엇이 잘못 되었나요? GQL은 어디에서 where의 직관적 인 방식으로 ID를 처리합니까?

#Get cookie   
user_id = self.request.cookies.get("user_id", 0) 

#Query Datastore for matching user_id 
user = db.GqlQuery("SELECT * FROM User WHERE id = %s" % user_id).get() 

#If a user is found, display the username 
if user.username: 
    signup = "Welcome, %s" % user.username 

답변

1

데이터 스토어 (옵션) 조상, 종류, 이름이나 ID를 구성하는 Key 속성이 있습니다. 그러나 특정 id 속성은 없습니다. (Reference)

가 특정 키를 가진 개체를 얻으려면, 코드는 다음과 같이 보일 것이다 :

# Get cookie   
user_id = self.request.cookies.get("user_id", 0) 

if not user_id: 
    # handle this case, otherwise the call to from_path will fail. 

# Build key 
user_key = db.Key.from_path('User', long(user_id)) 

# Get the entity 
user = db.get(user_key) 

# If a user is found, display the username 
if user.username: 
    signup = "Welcome, %s" % user.username 
당신은 실제로 당신이 이미 키를 알고 있기 때문에이 경우 쿼리를 사용하지 않으

당신이 찾고있는 엔티티의 키를하지 않습니다에 대한 평등 필터를 사용하기 때문에, 여기

user = db.GqlQuery("SELECT * FROM User WHERE __key__ > KEY('User', %s)" % user_id).get() 

공지 사항은 내가 불평등을 사용하고 있습니다 :

당신이 키를 쿼리하는, 당신은 전체 키 (뿐만 아니라 ID)를 지정해야 직접 조회를 할 수 있다면 당연한 것입니다. Here는 GQL 문자열에 KEY를 사용하는 참조이며, 나는 아래의 관련 섹션을 인용했습니다

비교의 오른쪽이 중 하나가 될 수 있습니다 다음 (재산의 데이터 형으로 필요한 경우) :

  • 문자열 인코딩 키 또는 종류 키 이름/ID의 전체 경로 중 하나를 리터럴 엔티티 키 :

    • KEY('encoded key')

    • KEY('kind', 'name'/ID [, 'kind', 'name'/ID...])

+0

좋아, 그래서 이전이 다소 get_by_id있어서 사용자를 사용한 작업 = User.get_by_id (INT (USER_ID))를 얻었다했지만 때 에러로 실행되고 쿠키가 존재하지 않습니다. 코드에서도이 같은 오류가 발생합니다. 이것은 user_id 쿠키가 존재하지 않을 때 사용하는 기본값 때문입니다. user_id = self.request.cookies.get ("user_id", 0). id_or_name 인수에 대해 from_path() 메서드가 0을 허용하지 않는다는 것을 알았습니다. Google App Engine 문서에서 ID는 문자열 또는 길이로 지정됩니다. 숫자 0이 될 수는 없습니다. – Hess

+0

아, 네 말이 맞습니다. 누락 된 쿠키는 깨뜨릴 것입니다.다른 사람들이 같은 문제를 겪지 않도록 코드를 편집하겠습니다. –