【问题标题】:Why doesn't my GQL query return any results in my GAE App?为什么我的 GQL 查询没有在我的 GAE 应用程序中返回任何结果?
【发布时间】:2010-11-05 19:19:39
【问题描述】:

我主要关注的是关于如何使用 GAE 和 Python 构建 gustbook 的教程。现在我只想显示特定日期的条目,但 GQL 查询不返回任何内容(尽管有当天的条目):

class Shout(db.Model):  
    message= db.StringProperty(required=True)  
    when = db.DateTimeProperty(auto_now_add=True)  
    who = db.StringProperty()  

class MainHandler(webapp.RequestHandler):  
    def get(self):  
        shouts = db.GqlQuery("SELECT * FROM Shout WHERE when=DATE('2010-11-05')")  
        # Return something without the WHERE clause
        values = {'shouts':shouts}  
        self.response.out.write(template.render('main.html',values))  

    def post(self):  
        self.response.out.write("posted")  
        shout = Shout(message=self.request.get("message"),who=self.request.get("who"))  
        shout.put()  

这是我的 main.html:

<form method="post">
   <input type="text" name="who"></input>
   <input type="text" name="message"></input>
   <input type="submit" value="Send"> </input>  
</form>

{% for shout in shouts  %}
   <div>{{shout.message}} from {{shout.who}} on {{shout.when}}</div>
{% endfor %}

【问题讨论】:

    标签: python google-app-engine gql


    【解决方案1】:

    可能有另一种解决方法,但我认为因为你的 when 属性是一个日期时间,你最好使用这样的东西:

    shouts = db.GqlQuery("""SELECT * 
                              FROM Shout 
                             WHERE when >= DATE('2010-11-05')
                               AND when < DATE('2010-11-06')""")
    

    【讨论】:

    • +1。或者,您可以将 DateProperty 添加到模型中,然后使用相等过滤器进行查询。这会占用更多空间,但更容易查询(两个关系运算符的相等性 - 特别重要,因为您只能在一个字段上使用关系运算符)。
    • 感谢您的补充,大卫。
    • 谢谢,现在可以使用了。是不是因为一些“舍入”问题,我不能只使用'='?
    • 我尝试让= 处理一些示例数据。这似乎是不可能的,因为 DateTime 属性以微秒存储; GQL 不支持 AFAICT。
    • @user67011 这是因为发布时间存储为日期时间(这是您指定的),并且您的日期被转换为当天的午夜作为日期时间。您的查询将仅返回恰好在午夜发布的结果,因为这些是在该确切时间发布的唯一结果。
    【解决方案2】:

    试试这个:

    shouts = db.GqlQuery("SELECT * FROM Shout WHERE when=DATE('2010-11-05')").fetch(5000)
    

    虽然可以将 Query 对象用作可迭代对象,但最好显式获取行而不依赖模板中的 for 来完成工作。我怀疑不支持这种方式。

    编辑: 现在我更仔细地看了一下,我怀疑问题在于您要查询的字段是 DateTimeProperty,并且通过使用 DATE 运算符,您实际上是在说您想要 2010-11-05 00:00:00 ,并且没有具有该确切日期和时间的记录,因此请尝试以下操作:

    shouts = db.GqlQuery("SELECT * FROM Shout WHERE when >= DATETIME('2010-11-05 00:00:00') and when <= DATETIME('2010-11-05 23:59:59')")
    

    【讨论】:

    • 和以前一样的问题。我认为 fetch 不是必需的,因为它没有在示例应用程序中使用(例如 code.google.com/p/google-app-engine-samples/source/browse/trunk/…)。
    • 我同意显式获取行是一个更好的主意 - 一次检索所有行更有效(迭代器以块的形式检索它们,这会导致额外的往返数据存储)。但是,让模板遍历查询对象没有问题 - 它的工作方式就像您使用常规 for 循环遍历它一样。
    • 我并不是要发出指责的声音:当有人明显想提供帮助时,我不喜欢看到投反对票。谢谢你的回答,亚当。
    • 哦,好吧。我急于回答这个问题,并没有考虑清楚。我的错。
    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多