这可能更像是一个普通的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
语句是否已返回用户(或用户列表)?
答案 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来解决此问题 方法