Python 为什么我的GQL查询在我的GAE应用程序中不返回任何结果?

Python 为什么我的GQL查询在我的GAE应用程序中不返回任何结果?,python,google-app-engine,gql,Python,Google App Engine,Gql,我主要学习了一个关于如何使用GAE和Python构建gustbook的教程。现在我只想显示某一天的条目,但GQL查询不会返回任何内容,尽管有来自该天的条目: class Shout(db.Model): message= db.StringProperty(required=True) when = db.DateTimeProperty(auto_now_add=True) who = db.StringProperty() class MainHan

我主要学习了一个关于如何使用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 %}
试试这个:

shouts = db.GqlQuery("SELECT * FROM Shout WHERE when=DATE('2010-11-05')").fetch(5000)
虽然可以将查询对象用作iterable,但最好显式地获取行,而不依赖模板中的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')")

也许有另一种方法可以解决这个问题,但我认为,因为当你的财产是一个日期时,你最好用这样的东西:

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

和以前一样的问题。我认为提取是不必要的,因为它没有在示例应用程序中使用。例如,我同意显式提取行是一个更好的主意-一次检索所有行更有效,迭代器将它们分块检索,这会导致数据存储的额外往返。但是,让模板在查询对象上迭代并没有问题——它的工作原理就像您使用常规的for循环对其进行迭代一样。我不想让人觉得我是在指责:当有人显然试图提供帮助时,我不喜欢看到向下投票。谢谢你的回答,亚当。我急忙回答这个问题,没有想清楚。我的坏朋友。或者,您可以向模型中添加DateProperty,然后使用相等筛选器查询该属性。这将占用更多的空间,但查询两个关系运算符会更容易-尤其重要,因为您只能在一个字段上使用关系运算符。谢谢添加,David。谢谢,它现在可以工作了。是否因为某些舍入问题,我不能只使用“=”?我尝试使用“=”来处理一些示例数据。这似乎是不可能的,因为DateTime属性是以微秒存储的;GQL中不支持的。@user67011这是因为post时间存储为您指定的日期时间,并且您的日期被转换为当天午夜的日期时间。您的查询将只返回恰好在午夜发布的结果,因为这些是在该确切时间发布的唯一结果。