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查询的主要内容,如果未能解决你的问题,请参考以下文章