Python中GQL查询日期相等

0 投票
3 回答
5485 浏览
提问于 2025-04-15 13:04

好的,上次你们反应很快,帮了我很多,所以我又来请教你们了;)

声明:我对Python很陌生,对App Engine更是新手。我现在想做的就是对App Engine教程中的一个例子进行简单的修改。

我把日期值存储在我的Memory类里:

class Memory(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateProperty(auto_now_add=True)

现在我想根据某个日期查找记录。我不太确定该怎么做,所以试了几种方法,包括:

memories = db.GqlQuery("SELECT * from Memory where date = '2007-07-20')
and
memories = Memory.all()
memories.filter("date=", datetime.strptime(self.request.get('date'), '%Y-%m-%d').date())
and
memories = Memory.all()
memories.filter("date=", self.request.get('date'))

但是每次运行的时候,我都会遇到ImportError的错误。老实说,我甚至不知道怎么理解这些错误信息,尤其是当应用程序出错时。不过,我只希望能根据某个日期查找Memory记录。

编辑:完整代码如下

import cgi
import time

from datetime import datetime
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class Memory(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateProperty()

class MainPage(webapp.RequestHandler):
    def get(self):
        self.response.out.write('<html><body>')

        memories = db.GqlQuery('SELECT * from Memory ORDER BY date DESC LIMIT 10')

        for memory in memories:
            self.response.out.write('<b>%s</b> wrote: ' % memory.author.nickname())
            self.response.out.write('<em>%s</em>' % memory.date)
            self.response.out.write('<blockquote>%s</blockquote>' % cgi.escape(memory.content))

        self.response.out.write("""
<div style="float: left;">
<form action="/post" method="post">
    <fieldset>
    <legend>Record</legend>
    <div><label>Memory:</label><input type="text" name="content" /></textarea></div>
    <div><label>Date:</label><input type="text" name="date" /></div>
    <div><input type="submit" value="Record memory" /></div>
    </fieldset>
</form>
</div>
<div style="float: left;">
<form action="/lookup" method="post">
    <fieldset>
    <legend>Lookup</legend>
    <div><label>Date:</label><input type="text" name="date" /></div>
    <div><input type="submit" value="Lookup memory" /></div>
    </fieldset>
</form>
</div>""")

        self.response.out.write('</body></html>')

class PostMemory(webapp.RequestHandler):
    def post(self):
        memory = Memory()

        if users.get_current_user():
            memory.author = users.get_current_user()

        memory.content = self.request.get('content')
        memory.date = datetime.strptime(self.request.get('date'), '%Y-%m-%d').date()

        memory.put()
        self.redirect('/')

class LookupMemory(webapp.RequestHandler):
    def post(self):
        memories = db.GqlQuery("SELECT * FROM Memory WHERE date = '2009-07-21'")

        for memory in memories:
            self.response.out.write('<b>%s</b> wrote: ' % memory.author.nickname())
            self.response.out.write('<em>%s</em>' % memory.date)
            self.response.out.write('<blockquote>%s</blockquote>' % cgi.escape(memory.content))     

application = webapp.WSGIApplication([('/', MainPage), ('/post', PostMemory), ('/lookup', LookupMemory)], debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

3 个回答

1
memories.filter("date=DATE(2007, 7, 20)")

请查看 GQL 参考文档

2

你正在尝试用GQL语法来处理不是GQL查询的对象。你可以选择以下几种方法:

  1. 使用查询对象,并传入一个日期对象:q = Memory.all().filter("date =", datetime.date.today())
  2. 使用GqlQuery,并使用日期语法:q = db.GqlQuery("SELECT * FROM Memory WHERE date = DATE(2007, 07, 20)")
  3. 使用GqlQuery,并传入一个日期对象:q = db.GqlQuery("SELECT * FROM Memory WHERE date = :1", datetime.date.today())
0
class Memory(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateProperty(auto_now_add=True)
memories = db.GqlQuery("SELECT * from Memory where date = '2007-07-20'")

memories = Memory.all().filter("date=", datetime.datetime.strptime(self.request.get('date'), '%Y-%m-%d').date())

memories = Memory.all().filter("date=", self.request.get('date'))

我觉得你可能遇到了内存的导入错误,或者是日期时间的导入错误。

如果内存的代码在另一个.py文件里,比如叫otherpyfile.py,你需要这样写:from otherpyfile import Memory,然后就可以用这个方式来使用它。

如果是日期时间的问题,那你需要写import datetime。你最开始的代码里引号不匹配,所以我帮你整理了一下。我也调整了你中间的部分,这样如果你导入了datetime就能正常工作了。

应用引擎的错误屏幕不总是很有帮助,所以你可以看看命令提示符里抛出的日志。如果你看到那个错误,可能值得把短的堆栈跟踪信息发给我,这样我可以更好地帮助你。

撰写回答