How do I refresh an NDB entity from the datastore?

微笑、不失礼 提交于 2019-12-13 18:37:25

问题


I'd like to be able to assert in tests that my code called Model.put() for the entities that were modified. Unfortunately, there seems to be some caching going on, such that this code:

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

Passes this test:

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

When I would really rather it didn't, since in the real world, update_entity won't actually change anything in the datastore.

Using Nose, datastore_v3_stub, and memcache_stub.


回答1:


You can bypass the caching like this:

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

These options are from ndb's context options. They can be applied to Model.get_by_id(), Model.query().fetch() and Model.query().get() too




回答2:


Your current test validates the "local", in-memory version of your entity (independent of what's in the datastore). You should re-fetch the entity from NDB before your checks:

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


来源:https://stackoverflow.com/questions/36409955/how-do-i-refresh-an-ndb-entity-from-the-datastore

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!