2012-07-13 4 views
0

이것은 일반적인 질문보다는 AppEngine 특정 질문 일 수 있습니다. 내 Google AppEngine GQL 쿼리가 개체를 반환하는지 여부를 결정하는 데 문제가 있습니다. 나는 새로운 해요 은 AppEngine에와 파이썬, 그래서 이것은 내가 파이썬 코드를 사용하고Python - AppEngine GQL 쿼리에서 무엇을 반환하는지 어떻게 알 수 있습니까?

간단한 질문이있을 수 있습니다 : 확인하고 사용자가 반환이 있다면, 내가 봤는데 보려면

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890") 

에게 시도 :

if(user in locals()): 
    self.response.out.write('User Exists: ' + user.user_id) 
    return 
else: 
    CreateTheUser() 

하지만 지금은 이것이 최선의 방법이 아니라고 생각합니다. 사용자 (또는 사용자 목록)가 db.GqlQuery 성명으로 반환되었는지 확인하는 더 좋은 방법이 있습니까?

if user is not None:  #or simply `if user` 
    #do something 
else: 
    #do something else 
+0

'사용자가 현지인()이라면 몇 가지 이유로 기대하지 않습니다. 먼저'locals()'를 검사하면 변수가 정의되었는지 알려줄 것입니다. 변수가 정의 된 이후에 항상 변수가 할당됩니다. 둘째, 사용자 변수의 _value_가 지역 변수의 키로 존재하는지 실제로 확인하고 있습니다. 수행하려는 작업은 locals() :'에 'user'가 있어야합니다. 예 :'foo = 'hello'; foo in locals()'는 locals()'에서'hello '와 같고, locals()'에서''foo' '에 _not_! –

답변

1

이 시도, 나는 쿼리가 아무것도 반환하지 않는 경우 user의 값이 None이 될 것이라고 생각 사용자 세부 정보 및 특성이 사용자 개체에 대해 정의되지 않은 경우 AttributeError이 표시됩니다. 또한 시스템에 존재하지 않는 모든 기본 제공 예외를 캡처하는 Exception을 사용할 수도 있습니다.

EAFP

: 권한보다 용서를 물어

쉽게. 이 일반적인 Python 코딩 스타일은 유효한 키나 속성의 존재를 가정하며 가정이 거짓으로 판명되면 예외를 포착합니다. 이 깔끔하고 빠른 스타일은 많은 시도가 있고 문을 제외하고는 많은 특징이 있습니다. 당신이 도약하기 전에

봐 : 기술은 C.

LBYL 많은 다른 언어에 공통 LBYL 스타일과 대조. 이 코딩 스타일은 호출 또는 조회를하기 전에 사전 조건을 명시 적으로 테스트합니다. 이 스타일은 과 EAFP 접근 방식을 대조하며 많은 경우에 문이있는 특징이 있습니다.

멀티 스레드 환경에서 LBYL 방식을 사용하면 에 "looking"와 "leaping"간에 경쟁 조건이 발생할 수 있습니다. 예를 들어 매핑의 키 : return mapping [key]가 인 경우 다른 코드가 테스트 후 매핑에서 키를 제거하면 보다 먼저 코드가 실패 할 수 있습니다. 이 문제는 잠금 또는 EAFP 접근 방법을 사용하여 해결할 수 있습니다. 귀하의 예제에서

+0

'사용자가 충분하다면'이 경우에 충분합니다. – aschmid00

+0

@ aschmid00 네가 맞아, 나는 그것을 완전히 잊어 버렸다. –

+0

잘 모르겠습니다. '사용자가 없음'을 발견하면 '사용자'보다 더 분명하고 읽기 쉽습니다. 그것은 단지 맛의 문제 일 뿐이지 만, 더 짧은 것이 항상 좋은 것은 아닙니다. –

0

try를 사용해보십시오 :

try: 
    self.response.out.write('User Exists: ' + user.user_id) 
except AttributeError: 
    CreateTheUser() 

이 접근 방식을 출력하려고합니다

+0

왜'try/except'를할까요? 이것은'Model.get_or_insert'가있는 하나의 라이너가 될 것이고 단순히'if user'가 아닌 이유는 무엇입니까? – aschmid00

+0

속성이 사라질 위험이 있다면'locks '및/또는'try/except' 절이 필요합니다. 변수가 정의되어 있는지 확인하는 것은 '사용자면'이라고 말한 것처럼 간단합니다. 그러나'user.user_id'는 원하는 속성입니다. – RobB

+0

나는 이해하지만,이 경우 사용자가 있다면 user_id가 있음을 분명히 알 수있다. 옵션 속성이 있다면 어쩌면 당신 말이 맞을 것입니다. 이 경우에 이것은 정말로 나에게 좋지 않게 보입니다. 죄송합니다 – aschmid00

1

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890")

는 항상 예를 ​​들어, 질의 객체를 반환합니다 <google.appengine.ext.db.Query object at 0xab71f6c> .

반환 된 결과를 확인하려면 .get(), .fetch(),을 사용해야합니다. run()을 사용하면 QueryIterator를 사용할 수 있습니다.

그래서 현재

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890") 
if user: 
    # do something 

또는

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890") 
if user not None: 
    # do something 

의 당신의 비교는 항상 지금까지 아무도 없을되지 않습니다 사용자로 전달합니다.

user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890").get()이 예제에서는 하나의 결과 만 기대할 수 있습니다. 그런 다음 if user: 비교를 수행하십시오.

fetch()를 사용하면 목록이 반환됩니다. 둘 이상의 사용자가 존재하는지 확인하려는 경우 유용 할 수 있습니다. (user_id에 대한 고유 한 제약 조건을 어떻게 관리하고 있는지는 모르겠지만 별도의 질문입니다 ;-)

관련 문제