brandones brandones - 1 year ago 140
Python Question

How do I refresh an NDB entity from the datastore?

I'd like to be able to assert in tests that my code called

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(, text)
new_entity = entity.key.get() # Doesn't do anything, apparently
# new_entity = entity.query( == name).fetch()[0] # Same
assert new_entity.text == text

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

Using Nose, datastore_v3_stub, and memcache_stub.

Answer Source

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

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download