2

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 中选择 *

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

4

1 回答 1

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_keyKey取回实例。

当您有可能进行查找而不是查询时:

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

全局查询 ( D.query()) 的问题是没有保证会有结果。有关详细信息,请参阅文档

NDB 分步写入数据:

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

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

results = D.query().fetch()  # results will be a list with D instances
于 2013-10-26T19:19:31.447 回答