在this document中,提到默认read_policy
设置为ndb.EVENTUAL_CONSISTENCY
。
在我从应用程序的数据存储版本中批量删除实体项目后,我继续读取旧数据,因此我试图弄清楚如何将其更改为STRONG_CONSISTENCY
但没有成功,包括:
entity.query().fetch(read_policy=ndb.STRONG_CONSISTENCY)
和...fetch(options=ndb.ContextOptions(read_policy=ndb.STRONG_CONSISTENCY))
我得到的错误是
BadArgumentError:read_policy参数无效('STRONG_CONSISTENCY')
如何更改此默认值?更重要的是,我如何确保NDB将转到数据存储区来加载结果而不是依赖于旧的缓存值? (请注意,批量删除后,数据存储区浏览器会告诉我实体已消失。)
答案 0 :(得分:1)
您无法更改该默认值,它也是唯一可用的选项。从你引用的doc(没有提到其他选项):
描述
如果,请将此设置为
ndb.EVENTUAL_CONSISTENCY
,而不是等待 您希望数据存储区完成对所有返回结果的更改 获得可能不是最新的结果。
通过检查google.appengine.ext.ndb.context.py
文件(其中没有STRONG_CONSISTENCY
定义)确认了相同的内容:
# Constant for read_policy.
EVENTUAL_CONSISTENCY = datastore_rpc.Configuration.EVENTUAL_CONSISTENCY
EVENTUAL_CONSISTENCY
通过ndb
google.appengine.ext.ndb.__init__.py
from context import *
__all__ += context.__all__
你可能能够使用这样的黑客来避免错误:
from google.appengine.datastore.datastore_rpc import Configuration
...fetch(options=ndb.ContextOptions(read_policy=Configuration.STRONG_CONSISTENCY))
但是我认为只适用于读取通过查询获得的密钥的实体,而不是获取密钥本身的列表,这些密钥来自查询使用的索引,这始终是最终一致 - 删除的实体的根本原因仍然出现在结果中(一段时间,直到索引更新)。来自Keys-only Global Query Followed by Lookup by Key:
但应该注意的是,仅限密钥的全局查询无法排除 指数在当时还不一致的可能性 查询,可能导致实体根本没有被检索。 可能会基于生成查询结果 过滤掉旧的索引值。总之,开发人员可以使用 仅限键的全局查询,然后仅在按键时按键查找 应用程序要求允许索引值尚未存在 在查询时保持一致。