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
中选择*
在数据查看器中,结果可以正确显示
答案 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