Google App Engine Datastore: извлечение данных с помощью запроса GQL

В настоящее время я играю с хранилищем данных Google App Engine и пытаюсь извлечь некоторые данные из базы данных моих приложений с помощью GQL.

import os
import re
import random
import hashlib
import hmac
from string import letters

import webapp2
import jinja2

from google.appengine.ext import db

template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape=True)

class Handler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)
    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)
    def render(self, template, **kw):
        self.write(self.render_str(template, **kw))

class Users(db.Model):
    name = db.StringProperty(required = True)
    password = db.StringProperty(required = True)
    email = db.EmailProperty(required = True)
    address = db.PostalAddressProperty(required = True)
    join_date = db.DateTimeProperty(auto_now_add = True)
    dob = db.DateTimeProperty()
    phone = db.PhoneNumberProperty()

class MainPage(Handler):
    def get(self):
        self.render("signup-form.html")
    def post(self):
        name = self.request.get("username")
        password = self.request.get("password")
        verify = self.request.get("verify")
        email = self.request.get("email")
        address = self.request.get("address")
        phone = self.request.get("phone")

        a = Users(name = name, password = password, email = email, address = address, phone = phone)
        a.put()
        p = Users.all()
        ans = p.filter("name = :1", "Manas")
        if(ans.email == "[email protected]"):
            self.response.write("Email found")
        else:
            self.response.write("Not found")


app = webapp2.WSGIApplication([('/', MainPage)], debug=True)

Теперь в моей таблице «Пользователи» уже хранится атрибут «Манас» с соответствующим идентификатором электронной почты «[email protected]». Соответственно, я должен получить сообщение «Электронная почта найдена». Однако я получаю эту ошибку:

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "F:\Python 2.7\engineapp1\HelloApp\appapp\main.py", line 48, in post
    ans = p.filter("name = :1", "Manas")
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 2560, in filter
    prop = match.group(1)
AttributeError: 'NoneType' object has no attribute 'group'

Что мне кажется неправильным в моем запросе?


person Manas Chaturvedi    schedule 05.02.2014    source источник


Ответы (1)


Query.filter не поддерживает заполнитель.

Замените следующую строку:

ans = p.filter("name = :1", "Manas")

с участием:

ans = p.filter("name =", "Manas")

ОБНОВЛЕНИЕ

filter возвращает итерацию, а не одну запись. Вам нужно повторить его, чтобы проверить, существует ли данный адрес электронной почты:

for x in ans:
    if x.email == "[email protected]":
        self.response.write("Email found")
else:
    self.response.write("Not found")

Более предпочтительно использовать связанные Query.filter и Query.count, нужно повторить это.

ans = p.filter("name =", "Manas").filter("email =", "[email protected]")
if ans.count(limit=1):
    self.response.write("Email found")
else:
    self.response.write("Not found")
person falsetru    schedule 05.02.2014
comment
AttributeError: объект 'Query' не имеет атрибута 'email' .... это ошибка, которую я получаю теперь после замены этой строки. - person Manas Chaturvedi; 05.02.2014
comment
@ManasChaturvedi, эта ошибка вызвана следующей строкой. Потому что filter возвращает итерацию (Query) вместо единственного экземпляра модели. Вам нужно повторить результат. Я обновил ответ. Проверить это. - person falsetru; 05.02.2014