在AppEngine Python中设置read_policy

时间:2018-03-27 14:18:35

标签: python app-engine-ndb eventual-consistency

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将转到数据存储区来加载结果而不是依赖于旧的缓存值? (请注意,批量删除后,数据存储区浏览器会告诉我实体已消失。)

1 个答案:

答案 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

  

但应该注意的是,仅限密钥的全局查询无法排除   指数在当时还不一致的可能性   查询,可能导致实体根本没有被检索。   可能会基于生成查询结果   过滤掉旧的索引值。总之,开发人员可以使用   仅限键的全局查询,然后仅在按键时按键查找   应用程序要求允许索引值尚未存在   在查询时保持一致。

有兴趣的可能:Bulk delete datastore entity older than 2 days