GQL-запрос на равенство дат в Python - PullRequest
0 голосов
/ 22 июля 2009

Хорошо, вы, ребята, были быстры и полезны в прошлый раз, поэтому я возвращаюсь к колодцу;)

Отказ от ответственности: я новичок в python и очень плохо знаком с App Engine. То, что я пытаюсь сделать, это простая модификация примера из учебника AppEngine.

В моем классе памяти хранится значение даты:

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

Ответы [ 3 ]

2 голосов
/ 22 июля 2009

Вы пытаетесь использовать синтаксис GQL с объектами запросов, не относящихся к GQL. Ваши варианты:

  1. Используйте объект Query и передайте объект datetime.date: q = Memory.all().filter("date =", datetime.date.today())
  2. Используйте GqlQuery и используйте синтаксис DATE: q = db.GqlQuery("SELECT * FROM Memory WHERE date = DATE(2007, 07, 20)")
  3. Используйте GqlQuery и передайте объект datetime.date: q = db.GqlQuery("SELECT * FROM Memory WHERE date = :1", datetime.date.today())
1 голос
/ 22 июля 2009
memories.filter("date=DATE(2007, 7, 20)")

См. Справочник GQL .

0 голосов
/ 22 июля 2009
class Memory(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateProperty(auto_now_add=True)

Я думаю, что вы либо получаете ошибки импорта для памяти, либо вы получаете ошибку импорта для datetime

если память находится в другом файле .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 не всегда полезен, поэтому взгляните на журналы, которые генерируются в командной строке. Если вы видите эту ошибку, возможно, стоит сбросить короткую трассировку стека, поэтому я могу попытаться помочь вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...