0

这可能是一个通用的 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有没有更好的方法来判断语句是否返回了用户(或用户列表) ?

4

3 回答 3

1

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

if user is not None:      #or simply `if user`
    #do something
else:
    #do something else
于 2012-07-13T17:33:43.620 回答
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

将永远通过,因为用户永远不会是 None 。

在这个特定示例中,您可能会使用user = db.GqlQuery("SELECT * FROM UserStore WHERE user_id = 1234567890").get()您只期望一个结果。然后进行if user:比较。

如果你使用 fetch() 你会得到一个列表。如果您想确认不超过一个用户存在,这可能很有用。(不确定您如何管理对 user_id 的唯一约束,但这是一个单独的问题 ;-)

于 2012-07-13T23:32:50.127 回答
0

尝试使用try

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

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

EAFP

请求宽恕比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多 try 和 except 语句。该技术与许多其他语言(如 C)常见的 LBYL 风格形成鲜明对比。

LBYL

三思而后行。这种编码风格在进行调用或查找之前明确测试前置条件。这种风格与 EAFP 方法形成对比,其特点是存在许多 if 语句。

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

于 2012-07-13T17:46:06.607 回答