2012-07-13 55 views
0

这可能是一个比AppEngine特定问题更常见的python问题。我无法确定我的Google AppEngine GQL查询是否返回对象。 我是新来的AppEngine和蟒蛇,所以这可能是一个简单的问题Python - 我如何知道AppEngine GQL查询是否返回任何内容?

我使用的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

'如果locals()'中的用户由于多种原因没有做你期望的事情。首先,检查locals()会告诉你变量是否被定义 - 它会一直存在,因为你刚分配给它。其次,你实际上是在检查用户变量的_value_是否作为本地关键字存在 - 你要做的应该是locals()中的'user'。例如'foo ='hello'; ()中的foo相当于locals()中的'hello',而不是当地人()中的''foo'! – 2012-07-20 07:09:03

回答

1

试试这个,我觉得user值将是None如果查询不返回任何内容:

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

如果用户在这种情况下绰绰有余。 – aschmid00 2012-07-13 18:01:10

+0

@ aschmid00是的你是对的,我完全忘了那个。 – 2012-07-13 18:10:12

+0

我不知道。我发现'如果用户不是None'比'if user'更明显和可读。这只是品味的问题,但更短并不总是更好。 – 2012-07-13 18:13:52

0

尝试使用try

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

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

EAFP

更容易请求原谅比许可。这种常见的Python编码风格假定存在有效的键或属性,并且如果假设证明为假,则捕获异常。这种干净而快速的风格的特点是存在很多尝试和除了 陈述。三思而后行

外观:该技术与常见的许多 其他语言LBYL风格如C.

LBYL对比。这种编码风格在进行调用或查找之前明确地测试 前提条件。这种方式将 与EAFP方法形成对比,其特征在于存在许多如果 陈述。

在多线程环境中,LBYL方法可能会冒 在“查看”和“跳跃”之间引入争用条件。 例如,如果另一个线程在测试之后从映射中删除密钥,但在查找之前删除密钥,则映射中的密钥如果返回映射[key]可能会失败 。此问题可以通过锁定或使用EAFP 方法来解决。

+0

你为什么要做“尝试/除外”?这将是一个带'Model.get_or_insert'的单线程,为什么不简单地用''! – aschmid00 2012-07-13 18:00:38

+0

如果存在属性可能消失的风险,则需要'lock'和/或'try/except'子句。检查变量是否被定义如你所说的'如果用户'那么简单。但'user.user_id'是所需的属性。 – RobB 2012-07-13 18:06:44

+0

我明白,但在这种情况下,它很清楚,如果有用户,有一个user_id。如果你有可选的属性,那么你也许是对的。在这种情况下,这对我来说真的不好看。对不起 – aschmid00 2012-07-13 18:13:24

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的唯一约束,但这是一个单独的问题;-)

相关问题