2014-02-05 3 views
0

Я сейчас играю с хранилищем данных Google App Engine и пытаюсь извлечь некоторые данные из базы данных приложений с помощью GQL.Google App Engine Datastore: извлечение данных с использованием запроса 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]», как его соответствующий электронный идентификатор. Поэтому, соответственно, я должен получить сообщение «Email found». Однако, я получаю эту ошибку:

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' 

Что, по-видимому, неверно в моем запросе?

ответ

1

Query.filter не принимает заполнитель.

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

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

с:

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

UPDATE

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") 
+0

AttributeError: объект «Query» не имеет атрибута «email» .... это ошибка, которую я получаю после замены этой строки. –

+0

@ManasChaturvedi, Эта ошибка вызвана следующей строкой. Потому что 'filter' возвращает итеративный (' Query') вместо экземпляра одной модели. Вам нужно повторить результат. Я обновил ответ. Проверьте это. – falsetru

+0

Спасибо! Он работает сейчас. –

Смежные вопросы