我的代码旨在:
我无法让应用显示欢迎讯息。据我所知,问题是查询总是返回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
答案 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...])