ID的GqlQuery总是返回None结果

时间:2013-10-05 13:46:40

标签: google-app-engine google-cloud-datastore gql gqlquery

我的代码旨在:

  • 从cookie中检索user_id(如果存在)。
  • 使用user_id查询数据存储区以检索用户记录。
  • 最后,如果找到记录,则会显示欢迎消息。 (注册传递给模板)

我无法让应用显示欢迎讯息。据我所知,问题是查询总是返回None。我已经验证了cookie并且数据存储中的数据存在。

这个查询我做错了什么? GQL是否以非直观的方式处理where子句中的ID?

#Get  cookie        
user_id = self.request.cookies.get("user_id", 0)

#Query Datastore for matching user_id
user = db.GqlQuery("SELECT * FROM User WHERE id = %s" % user_id).get()  

#If a user is found, display the username
if user.username:
    signup = "Welcome, %s" % user.username

1 个答案:

答案 0 :(得分:1)

数据存储区具有Key属性,该属性由(可选)祖先,种类,名称或ID组成。但是,没有特定的id属性。 (Reference)

要获取具有特定键的实体,您的代码应如下所示:

# Get cookie        
user_id = self.request.cookies.get("user_id", 0)

if not user_id:
  # handle this case, otherwise the call to from_path will fail.

# Build key
user_key = db.Key.from_path('User', long(user_id))

# Get the entity
user = db.get(user_key)

# If a user is found, display the username
if user.username:
    signup = "Welcome, %s" % user.username

在这种情况下,您实际上不想使用查询,因为您已经知道要查找的实体的密钥。

使用密钥查询时,必须指定整个密钥(而不仅仅是id):

user = db.GqlQuery("SELECT * FROM User WHERE __key__ > KEY('User', %s)" % user_id).get()

请注意我在使用不等式,因为对于键使用相等过滤器没有意义,因为您可以直接查找。 Here是在GQL字符串中使用KEY的参考,我引用了下面的相关部分:

  

比较的右侧可以是以下之一(适用于属性的数据类型):

     
      
  • 实体密钥文字,带有字符串编码密钥或种类和密钥名称/ ID的完整路径:

         
        
    • KEY('encoded key')

    •   
    • KEY('kind', 'name'/ID [, 'kind', 'name'/ID...])

    •   
  •