Google Cloud Datastore 'NoneType' object 没有属性 'email'
Google Cloud Datastore 'NoneType' object has no attribute 'email'
当我尝试从我的数据存储中获取类型时,它 return 是 NoneType,就好像查询是空的一样。我知道数据存储区在保存时工作正常,但从查询中提取一种却不行。
还可以使用 Google 云控制台网站中的 GQL 查询并使用 SELECT * FROM User
return 所有类型。用户种类没有parents,它在根。我确保所有属性都已编入索引。
我不确定我在 GET 上做错了什么。
MyApp.py
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.db import GqlQuery
class MainHandler(webapp2.RequestHandler):
def post(self):
message = self.request.body
message = message.splitlines()
if message[0] == "register":
user = User.create_user(message[1], message[2], message[3])
user_key = User.save_user(user)
if user_key is not None:
self.response.write(user_key)
else:
user = User.get_by_id(User.email == message[0])
if User.token == message[1]:
self.response.write("CURRENT")
else:
User.token = message[1]
User.save_user(user)
self.response.write("UPDATED")
def get(self):
self.response.write("CONNECTED")
user= User.query().get()
self.response.write("\n" + query.email)
class User(ndb.Model):
email = ndb.StringProperty()
token = ndb.StringProperty()
name = ndb.StringProperty()
@classmethod
def create_user(cls, email, token, name):
user = User(email=email, token=token, name=name, id=email)
return user
@classmethod
def save_user(cls, user):
user_key = user.put()
return user_key
@classmethod
def get_user(cls, email):
return User.get_by_id(User.email == email)
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
您似乎混淆了 .get_by_id()
与查询。
get_by_id
方法实际上映射到ndb.Model._get_by_id
调用ndb.Model._get_by_id_async
,这需要一个实体密钥标识符来确定用于执行直接的实体密钥实体查找(不是查询!)。来自 appengine.ext.ndb.model.py
:
@classmethod
@utils.positional(3)
def _get_by_id_async(cls, id, parent=None, app=None, namespace=None,
**ctx_options):
"""Returns an instance of Model class by ID (and app, namespace).
This is the asynchronous version of Model._get_by_id().
"""
key = Key(cls._get_kind(), id, parent=parent, app=app, namespace=namespace)
return key.get_async(**ctx_options)
但是在您的代码中,您将作为 id
布尔值传递:User.email == message[0]
,它很可能不会匹配任何现有的实体键标识符,因此 None
结果导致您看到的错误。
由于您可用的信息是实体的 属性 的值(email
值),您可能想要执行查询,如下所示:
results = User.query(User.email == message[0]).fetch(limit=1)
if results:
user = results[0]
所以我弄清楚出了什么问题。因此 Google Cloud SDK 在我的计算机上的设置方式似乎存在问题。当 运行 在 google 服务器上而不是在我的网络上使用相同的代码时,一切似乎都正常工作。
当我尝试从我的数据存储中获取类型时,它 return 是 NoneType,就好像查询是空的一样。我知道数据存储区在保存时工作正常,但从查询中提取一种却不行。
还可以使用 Google 云控制台网站中的 GQL 查询并使用 SELECT * FROM User
return 所有类型。用户种类没有parents,它在根。我确保所有属性都已编入索引。
我不确定我在 GET 上做错了什么。
MyApp.py
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.db import GqlQuery
class MainHandler(webapp2.RequestHandler):
def post(self):
message = self.request.body
message = message.splitlines()
if message[0] == "register":
user = User.create_user(message[1], message[2], message[3])
user_key = User.save_user(user)
if user_key is not None:
self.response.write(user_key)
else:
user = User.get_by_id(User.email == message[0])
if User.token == message[1]:
self.response.write("CURRENT")
else:
User.token = message[1]
User.save_user(user)
self.response.write("UPDATED")
def get(self):
self.response.write("CONNECTED")
user= User.query().get()
self.response.write("\n" + query.email)
class User(ndb.Model):
email = ndb.StringProperty()
token = ndb.StringProperty()
name = ndb.StringProperty()
@classmethod
def create_user(cls, email, token, name):
user = User(email=email, token=token, name=name, id=email)
return user
@classmethod
def save_user(cls, user):
user_key = user.put()
return user_key
@classmethod
def get_user(cls, email):
return User.get_by_id(User.email == email)
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
您似乎混淆了 .get_by_id()
与查询。
get_by_id
方法实际上映射到ndb.Model._get_by_id
调用ndb.Model._get_by_id_async
,这需要一个实体密钥标识符来确定用于执行直接的实体密钥实体查找(不是查询!)。来自 appengine.ext.ndb.model.py
:
@classmethod @utils.positional(3) def _get_by_id_async(cls, id, parent=None, app=None, namespace=None, **ctx_options): """Returns an instance of Model class by ID (and app, namespace). This is the asynchronous version of Model._get_by_id(). """ key = Key(cls._get_kind(), id, parent=parent, app=app, namespace=namespace) return key.get_async(**ctx_options)
但是在您的代码中,您将作为 id
布尔值传递:User.email == message[0]
,它很可能不会匹配任何现有的实体键标识符,因此 None
结果导致您看到的错误。
由于您可用的信息是实体的 属性 的值(email
值),您可能想要执行查询,如下所示:
results = User.query(User.email == message[0]).fetch(limit=1)
if results:
user = results[0]
所以我弄清楚出了什么问题。因此 Google Cloud SDK 在我的计算机上的设置方式似乎存在问题。当 运行 在 google 服务器上而不是在我的网络上使用相同的代码时,一切似乎都正常工作。