【问题标题】:Why GQL Query does not match?为什么 GQL 查询不匹配?
【发布时间】:2009-03-21 09:37:24
【问题描述】:

我想做的是构建一些迷你 cms,其中包含带有 uri 的页面。

我的 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 菜鸟,App Engine 非常适合最终学习这门语言。

【问题讨论】:

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


    【解决方案1】:

    我找到了解决办法!

    问题在于模型。

    应用引擎数据存储不索引 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()
    

    【讨论】:

    • 您实际上根本不需要 uri 属性。如果您创建的 Page 实体的 key_name 等于 URI,您可以使用 Page.get_by_key_name(uri) 查找它,您可以免费获得唯一性!
    • 啊,好主意蛛形纲动物。我想为您的提示 +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()
    

    【讨论】:

    • 是的,我提供了一个错误的例子。即使使用命名参数或位置参数,我仍然得到相同的结果。现在更正示例,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2014-06-05
    • 1970-01-01
    相关资源
    最近更新 更多