无法更新 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]