2014-02-05 79 views
0

我目前正在使用Google App Engine数据存储,并尝试使用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]”作为其相应的电子邮件ID。因此,我应该会显示“发现电子邮件”消息。然而,我得到这个错误:

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.filterQuery.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:'查询'对象没有属性'email'....这是我现在得到的错误,现在取代该行后。 –

+0

@ManasChaturvedi,该错误是由下一行引起的。因为'filter'返回一个可迭代('Query')而不是单个模型实例。你需要迭代结果。我更新了答案。一探究竟。 – falsetru

+0

谢谢!它现在有效.. –

相关问题