为什么GQL查询不匹配?

时间:2009-03-21 09:37:25

标签: python google-app-engine google-cloud-datastore

我想要做的是构建一些使用uri保存页面的迷你cms。

我的urls.py中的最后一个路由指向我的views.py中的一个函数,该函数检查数据存储区中是否有可用当前请求的相同uri的页面,如果是,则显示该页面。

我有一个模特:

class Page(db.Model): 
  title = db.StringProperty(required=True) 
  uri = db.TextProperty(required=True) 
  created = db.DateTimeProperty(auto_now_add=True) 
  modified = db.DateTimeProperty(auto_now=True) 
  content = db.TextProperty() 

在我看来:

def show(request): 
  page = db.GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get() 
  if page is None: 
    return http.HttpResponseNotFound() 
  else: 
    return respond(request, 'pages_show', {'content': request.path}) 

我已经在数据存储区添加了一个带有'/ work'的实体作为uri。

即使request.path正好是'/ work',查询也不会返回匹配项。

感谢你给我的任何建议!

是的,我是一个python noob,App Engine是最终学习语言的完美选择。

2 个答案:

答案 0 :(得分:4)

我找到了解决方案!

问题在于模型。

App引擎数据存储区不会为TextProperty编制索引。从一开始就使用该类型是错误的,所以我将其更改为StringProperty,它确实被索引,因此哪个数据存储允许我们在WHERE子句中使用。

工作模式示例:

   class Page(db.Model): 
      title = db.StringProperty(required=True) 
      // string property now
      uri = db.StringProperty(required=True) 
      created = db.DateTimeProperty(auto_now_add=True) 
      modified = db.DateTimeProperty(auto_now=True) 
      content = db.TextProperty()

答案 1 :(得分:2)

如果使用命名关键字参数(“uri =:uri”),则必须将参数显式绑定到命名关键字。而不是:

# incorrect named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', request.path).get()

你想要

# correct named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get()

或者您可以使用位置参数:

# correct positional parameter
GqlQuery('SELECT * FROM Page WHERE uri=:1', request.path).get()