0

我的代码旨在:

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

我无法让应用程序显示欢迎消息。据我所知,问题是查询总是返回无。我已经验证了 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
4

1 回答 1

1

数据存储有一个Key属性,它由(可选的)祖先、种类和名称或 ID 组成。但是,没有特定的 id 属性。(参考)

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

# 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()

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

比较的右侧可以是以下之一(根据属性的数据类型而定):

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

    • KEY('encoded key')

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

于 2013-10-05T19:35:54.120 回答