Python中关于日期相等的GQL查询

Posted

技术标签:

【中文标题】Python中关于日期相等的GQL查询【英文标题】:GQL Query on date equality in Python 【发布时间】:2009-07-22 01:41:31 【问题描述】:

好的,上次你们很快而且乐于助人,所以我要回井了;)

免责声明:我是 python 新手,对 App Engine 非常陌生。我正在尝试对 AppEngine 教程中的示例进行简单修改。

我的日期值存储在我的 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。坦率地说,我什至不确定如何解析应用程序失败时收到的这些错误消息,但我很高兴能够查找某个日期的内存记录。

编辑:下面是完整的源代码

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()

【问题讨论】:

【参考方案1】:

您正在尝试对非 GQL 查询对象使用 GQL 语法。您的选择是:

    使用 Query 对象并传入 datetime.date 对象:q = Memory.all().filter("date =", datetime.date.today()) 使用 GqlQuery 并使用 DATE 语法:q = db.GqlQuery("SELECT * FROM Memory WHERE date = DATE(2007, 07, 20)") 使用 GqlQuery 并传入 datetime.date 对象:q = db.GqlQuery("SELECT * FROM Memory WHERE date = :1", datetime.date.today())

【讨论】:

你自己能运行这段代码吗?除了这个电话之外,也许我还有其他问题?这似乎不太可能,但我的想法已经用完了:( 呃,抱歉,我没有看到您收到的错误是 ImportError。这与 GQL 或查询无关 - 如果我们要提供帮助,您需要向我们展示错误的堆栈跟踪。【参考方案2】:
memories.filter("date=DATE(2007, 7, 20)")

请参阅GQL Reference。

【讨论】:

我试过了,但我仍然收到错误。如果我取出日期过滤线,一切正常。 但是感谢 GQL 参考的链接。我正在寻找与如何比较日期类型相关的东西,但没有成功。我想我并没有太努力;)在此期间我会搞砸的。【参考方案3】:
class Memory(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateProperty(auto_now_add=True)

我认为您要么遇到内存导入错误,要么遇到日期时间导入错误

如果内存在另一个 .py 文件中,例如 otherpyfile.py,你需要做 from otherpyfile import Memory 然后这样使用它

如果是日期时间问题,则需要import datetime。您的第一个答案的引号不匹配,因此排序如此。我对你中间的进行了排序,这样如果你导入 datetime

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'))

appengine 错误屏幕并不总是有用,因此请查看命令提示符中抛出的日志。如果您看到该错误,可能值得转储它所做的简短堆栈跟踪,以便我可以尝试进一步帮助您。

【讨论】:

谢谢,这让我更接近了一点(我想!)我不确定我之前运行时是否有报价错误,但现在,我没有收到硬编码日期的任何错误 = '2007-07-20',但我没有得到任何结果,即使我知道该日期的条目已发布到数据存储区。我已经用整个源代码修改了这个问题。也许我错过了一些非常简单的东西。 好的,最后,第二个版本终于为我解决了。我以为我已经尝试过,但一定是遗漏了一些东西。谢谢大家的回复。

以上是关于Python中关于日期相等的GQL查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GQL 中查询过去 6 小时(日期时间)的所有条目?

oracle中关于日期的获取

谷歌应用引擎 GQL,如何以毫秒精度使用日期时间进行分页

SQL中关于返回查询记录条数的语句

python 中关于字典的键

python中关于操作时间的方法:使用datetime模块