Python - 如何判断AppEngine GQL查询是否返回任何内容?

时间:2012-07-13 17:32:18

标签: python google-app-engine

这可能更像是一个普通的python问题而不是AppEngine特定的问题。我在确定我的Google AppEngine GQL查询是否返回对象时遇到问题。 我是AppEngine和python的新手,所以这可能是一个简单的问题

我正在使用python代码:

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语句是否已返回用户(或用户列表)?

3 个答案:

答案 0 :(得分:1)

试试这个,我认为如果查询没有返回任何内容,user的值将为None

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

答案 1 :(得分: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的唯一约束,但这是一个单独的问题; - )

答案 2 :(得分:0)

尝试使用try

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

此方法将尝试输出用户详细信息,如果未定义用户对象的属性,那么您将获得AttributeError。您还可以使用Exception来捕获所有内置的,非系统退出的异常。

EAFP

  

比获得许可更容易请求宽恕。这个常见的Python   编码风格假定存在有效的键或属性   如果假设被证明是假的,则捕获异常。这干净又快   风格的特点是存在许多尝试和除外   声明。该技术与许多人共同的LBYL风格形成鲜明对比   其他语言,如C.

LBYL

  

在你跳跃之前先看看。这种编码风格明确地测试   在进行呼叫或查找之前的前提条件。这种风格形成对比   采用EAFP方法,其特点是存在许多if   语句。

     

在多线程环境中,LBYL方法可能存在风险   在“寻找”和“跳跃”之间引入竞争条件。   例如,代码,如果键映射:return mapping [key]可能会失败   如果另一个线程在测试之后但之前从映射中删除了键   查找。可以使用锁定或使用EAFP来解决此问题   方法