【问题标题】:NDB projection & caching questionsNDB 投影和缓存问题
【发布时间】:2012-09-09 12:38:42
【问题描述】:

我对 NDB 投影查询的工作方式以及缓存在后台的行为方式有一些疑问

所以给定一个类似的模型:

class Users(ndb.Model):
    user_name = ndb.StringProperty(required=True)
    user_email = ndb.StringProperty(required=True)
    user_password = ndb.StringProperty(required=True)

    @classmethod # THIS ONE DOES NOT WORK
    def get_profile_info(cls, id):
        return ndb.Key(Users, id).get(projection=[Users.user_name])

    @classmethod # THIS ONE WORKS
    def get_profile_info(cls, id):
        return Users.query(Users.key == ndb.Key(Users, id)).get(projection=[Users.user_name])

为什么第一个类方法会引发“TypeError: Unknown configuration option ('projection')”?我不能简单地调用直接获取键的投影,而不必查询键吗?

其次,关于缓存,我不确定我是否正确理解了这个帖子:NDB Caching When Using Projected Queries

预测的查询不会被缓存吗?这是否意味着直接调用 get()(并获取整个实例)以便缓存而不是投影更好?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    根据错误,使用 get 时投影没有意义。从文档中“它只获取投影中这些属性的值。它从查询索引中获取此数据(因此,投影中的属性必须被索引)”。所以做 get 不是通过索引访问对象属性。请注意 gvr 在您引用的问题中对缓存的评论。

    【讨论】:

    • 好吧,也许我对索引有误解。不使用 Key().get() 使用 GAE Keys 的索引获取实例吗?例如: Key(Users, 1).get() 将获取 ID = 1 的整个 User 实例。这不是来自包含 Keys 的索引吗?
    • 从索引中检索投影属性。即投影中的所有属性都必须有索引。
    • Key(Users, 1).get() 将直接从实体表中获取实体,无需任何索引查找。
    • 有两个不同的东西叫做get()。一种查询方法支持投影。关键方法不是。
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2017-06-21
    • 2012-07-22
    相关资源
    最近更新 更多