GAE数据存储使用Python过滤不返回任何数据

时间:2013-10-26 05:07:06

标签: python google-app-engine google-cloud-datastore

db模式文件在db/d.py文件中定义为:

from google.appengine.ext import db
class D(db.Model):
    did = db.StringProperty(required = True)
    sample_tm = db.DateTimeProperty(auto_now_add = True)
    weekday = db.IntegerProperty(required = False)

使用此架构已将大量数据插入数据存储区,因为我可以在应用引擎中的数据存储区查看器中看到这些数据。

但是,当我尝试使用python查询处理程序python脚本中的数据时会出现问题。

from db import d
class WaitTimeQuery(webapp2.RequestHandler):

    def post(self):
        self.response.headers['Content-Type'] = 'text/html'         
        q = d.D.all()
        print q.get()

每次只打印None。为什么这些数据无法以这种方式获取?

此外,我尝试在python中使用嵌入式gql,但是在执行时不会返回任何结果:

  

从D

中选择*

在数据查看器中,结果可以正确显示

1 个答案:

答案 0 :(得分:1)

首先,正如Remco Haszing所说,在编写新应用程序时使用ndb而不是db。编写旧版应用程序时,可以使用db,但您应该迁移到ndb。 ; - )

required=False也不是必需的,这是默认值。 ; - )

from google.appengine.ext import ndb

class D(ndb.Model):
    did = ndb.StringProperty(required=True)
    sample_tm = ndb.DateTimeProperty(auto_now_add=True)
    weekday = ndb.IntegerProperty()

创建实例并放置它:

d = D(did='spam')
d_key = d.put()  # Stores the instance.

d_key是您可以用来从数据存储区返回实例的Key

如果您有可能进行查找而不是查询:

d = d_key.get()
assert d.did == 'spam'

全局查询(D.query())的问题在于没有保险会有结果。有关详细信息,请参阅the docs

  

NDB按步骤写入数据:

     
      
  • 在提交阶段,基础数据存储区服务会记录更改。
  •   
  • NDB使受影响的实体/实体的缓存无效。因此,将来的读取将从基础数据存储区读取(并缓存),而不是从缓存中读取过时值。
  •   
  • 最后,也许几秒钟后,基础数据存储区应用更改。它使更改对全局查询和最终一致的读取可见。
  •   

在数据存储区中应用更改后,您可以使用全局查询:

results = D.query().fetch()  # results will be a list with D instances