【问题标题】:How do I refresh an NDB entity from the datastore?如何从数据存储区刷新 NDB 实体?
【发布时间】:2016-04-04 18:17:52
【问题描述】:

我希望能够在测试中断言我的代码为被修改的实体调用了Model.put()。不幸的是,似乎有一些缓存正在进行,例如这段代码:

from google.appengine.ext import ndb

class MyModel(ndb.Model):
    name = StringProperty(indexed=True)
    text = StringProperty()

def update_entity(id, text):
    entity = MyModel.get_by_id(id)
    entity.text = text
    # This is where entity.put() should happen but doesn't

通过此测试:

def test_updates_entity_in_datastore(unittest.TestCase):
    name = 'Beartato'
    entity = MyModel(id=12345L, name=name, text=None)
    text = 'foo bar baz'
    update_entity(entity.key.id(), text)
    new_entity = entity.key.get()  # Doesn't do anything, apparently
    # new_entity = entity.query(MyModel.name == name).fetch()[0]  # Same
    assert new_entity.text == text

如果我真的不想这样做,因为在现实世界中,update_entity 实际上不会更改数据存储区中的任何内容。

使用 Nose、datastore_v3_stub 和 memcache_stub。

【问题讨论】:

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


    【解决方案1】:

    你可以像这样绕过缓存:

    entity = key.get(use_cache=False, use_memcache=False)

    这些选项来自 ndb 的 context options。它们也可以应用于Model.get_by_id()Model.query().fetch()Model.query().get()

    【讨论】:

      【解决方案2】:

      您当前的测试验证实体的“本地”内存版本(与数据存储区中的内容无关)。您应该在检查之前从 NDB 重新获取实体:

      new_entity = entity.key.get()
      assert [...]
      

      【讨论】:

      • 编辑了问题以澄清 - 尝试过,它不会改变任何东西。
      • 我认为这可能是因为您明确设置了一个 ID 并且存根以某种方式将实体放入缓存中?如果不设置 ID,则 Key 应为 None。
      猜你喜欢
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2016-07-26
      相关资源
      最近更新 更多