为什么我的GAE应用中的GQL查询不返回结果?

1 投票
2 回答
741 浏览
提问于 2025-04-16 06:37

我大致上按照一个教程学习如何用GAE和Python制作一个留言簿。现在我只想显示某一天的留言,但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 %}

2 个回答

1

试试这个:

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

虽然可以把查询对象当作一个可遍历的对象来用,但更好的做法是明确地获取数据行,而不是依赖模板中的for来处理。我怀疑这样做可能不被支持。

补充说明:
现在仔细看看,我怀疑问题出在你查询的字段是一个日期时间属性。使用日期操作符时,你实际上是在说你想要的是2010年11月5日 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')")
2

可能还有其他解决办法,但我觉得因为你的 when 属性是一个日期时间类型,使用下面这样的方式会更合适:

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

撰写回答