无法更新 google-apps-engine 中的数据存储
can't update datastore in google-apps-engine
我创建了一个类似于留言簿教程的数据存储对象:
class myDS(ndb.Model):
a = ndb.StringProperty(indexed=True)
我有一个处理程序来访问它,更新是:
class Handler1:
my_ds = myDS()
my_ds.a = "abc" #Trying to update the value
class Handler2:
my_ds = myDS()
self.response.write(my_ds.a) #Trying to access my_ds.aafter it was updated in Handlers1
def main():
application = webapp.WSGIApplication([
('/set', Handler1),
('/get', Handler2])
我叫:
Myapp.com/set
Myapp.com/get : Prints None (Didn't update to "abc")
为什么 a 的值没有更新?
我如何更新处理程序?
首先要注意的是,在 Handler1
中,您的代码实际上并未将实体保存到数据存储区,为此您需要调用 .put()
方法:
my_ds = myDS()
my_ds.a = "abc" #Trying to update the value
my_ds_key = my_ds.put() # save my_ds to the datastore and get its key
要注意的第二件事是,在 Handler2
中,my_ds = myDS()
调用不会像您预期的那样从数据存储中检索实体,它只是创建一个 new 实体(也不会保存到数据存储区)。要从数据存储中检索实体,您需要通过实体的键进行查找(或通过查询获取):
my_ds = my_ds_key.get()
这些是关于使用数据存储的非常基本的概念,您可能需要更加熟悉它们。您应该阅读 Creating, Retrieving, Updating, and Deleting Entities(也许其他相关章节分组在该文档页面左侧导航栏的 Google Cloud Datastore
部分下)
最后,为了能够进行此类查找,您需要能够以某种方式确定或将在 Handler1
中获得的实体密钥传输到 Handler2
,因为对这些处理程序的每个请求都独立于每个请求-其他。可能感兴趣:
通过 webapp2
个会话传递密钥的字符串表示的示例:
在Handler1
my_ds_key = my_ds.put() # save my_ds to the datastore and get its key
self.session['urlsafe'] = my_ds_key.urlsafe()
在Handler2
urlsafe = self.session.get('urlsafe')
if urlsafe:
my_ds = ndb.Key(urlsafe=urlsafe).get()
使用 URL 查询字符串(如 /get?urlsafe=<key's urlsafe representation>
传递密钥的字符串表示的示例(如果需要,可以散列,因为它将在浏览器中可见):
在Handler1
my_ds_key = my_ds.put() # save my_ds to the datastore and get its key
self.redirect('/get?urlsafe=%s' % my_ds_key.urlsafe())
在Handler2
urlsafe = self.request.get('urlsafe')
if urlsafe:
my_ds = ndb.Key(urlsafe=urlsafe).get()
通过查询获取 Handler2
中的实体的示例(该示例假设查询返回了正确的实体)
results = myDS().query().fetch(limit=1)
if results:
my_ds = results[0]
我创建了一个类似于留言簿教程的数据存储对象:
class myDS(ndb.Model):
a = ndb.StringProperty(indexed=True)
我有一个处理程序来访问它,更新是:
class Handler1:
my_ds = myDS()
my_ds.a = "abc" #Trying to update the value
class Handler2:
my_ds = myDS()
self.response.write(my_ds.a) #Trying to access my_ds.aafter it was updated in Handlers1
def main():
application = webapp.WSGIApplication([
('/set', Handler1),
('/get', Handler2])
我叫:
Myapp.com/set
Myapp.com/get : Prints None (Didn't update to "abc")
为什么 a 的值没有更新? 我如何更新处理程序?
首先要注意的是,在 Handler1
中,您的代码实际上并未将实体保存到数据存储区,为此您需要调用 .put()
方法:
my_ds = myDS()
my_ds.a = "abc" #Trying to update the value
my_ds_key = my_ds.put() # save my_ds to the datastore and get its key
要注意的第二件事是,在 Handler2
中,my_ds = myDS()
调用不会像您预期的那样从数据存储中检索实体,它只是创建一个 new 实体(也不会保存到数据存储区)。要从数据存储中检索实体,您需要通过实体的键进行查找(或通过查询获取):
my_ds = my_ds_key.get()
这些是关于使用数据存储的非常基本的概念,您可能需要更加熟悉它们。您应该阅读 Creating, Retrieving, Updating, and Deleting Entities(也许其他相关章节分组在该文档页面左侧导航栏的 Google Cloud Datastore
部分下)
最后,为了能够进行此类查找,您需要能够以某种方式确定或将在 Handler1
中获得的实体密钥传输到 Handler2
,因为对这些处理程序的每个请求都独立于每个请求-其他。可能感兴趣:
通过 webapp2
个会话传递密钥的字符串表示的示例:
在Handler1
my_ds_key = my_ds.put() # save my_ds to the datastore and get its key
self.session['urlsafe'] = my_ds_key.urlsafe()
在Handler2
urlsafe = self.session.get('urlsafe')
if urlsafe:
my_ds = ndb.Key(urlsafe=urlsafe).get()
使用 URL 查询字符串(如 /get?urlsafe=<key's urlsafe representation>
传递密钥的字符串表示的示例(如果需要,可以散列,因为它将在浏览器中可见):
在Handler1
my_ds_key = my_ds.put() # save my_ds to the datastore and get its key
self.redirect('/get?urlsafe=%s' % my_ds_key.urlsafe())
在Handler2
urlsafe = self.request.get('urlsafe')
if urlsafe:
my_ds = ndb.Key(urlsafe=urlsafe).get()
通过查询获取 Handler2
中的实体的示例(该示例假设查询返回了正确的实体)
results = myDS().query().fetch(limit=1)
if results:
my_ds = results[0]