Testing 谷歌数据存储模拟器

Testing 谷歌数据存储模拟器,testing,indexing,google-cloud-datastore,emulation,Testing,Indexing,Google Cloud Datastore,Emulation,为了进行测试,我们使用Google提供的LocalDatastoreHelper类启动云数据存储模拟器的本地实例 有趣的发现是,我们可以用代码插入数据,然后通过执行GQL查询再次找到数据 选择[…]其中myfield=true 如果我们在谷歌云上托管一个“实时”商店 但是: 当我们对本地运行的仿真器运行相同的代码时,插入可以工作,但查询不能。findAll()可以正常工作,因此它看起来像是插入和读取一般工作,但不知何故索引丢失了 在阅读了几个小时的文档之后,我没有发现任何提示,为什么会发生这种情

为了进行测试,我们使用Google提供的LocalDatastoreHelper类启动云数据存储模拟器的本地实例

有趣的发现是,我们可以用代码插入数据,然后通过执行GQL查询再次找到数据

选择[…]其中myfield=true

如果我们在谷歌云上托管一个“实时”商店

但是:

当我们对本地运行的仿真器运行相同的代码时,插入可以工作,但查询不能。findAll()可以正常工作,因此它看起来像是插入和读取一般工作,但不知何故索引丢失了

在阅读了几个小时的文档之后,我没有发现任何提示,为什么会发生这种情况


有人能帮忙吗?

很可能你遇到的是最终的一致性。默认情况下,数据存储模拟器模拟0.9的一致性。请注意,大多数查询最终都是一致的,除非WHERE子句是键或查询是祖先查询。我相信你是幸运的,“生活”商店返回结果。如果您在一天中的不同时间运行测试足够多的时间,那么它可能不会返回结果(这完全取决于更新索引的时间和时间)

这就是说,数据存储模拟器有一个选项来指定它应该模拟的一致性级别。这可以通过以下命令完成:

gcloud beta emulators datastore start --data-dir=/my/data/dir --host-port localhost:9999 --consistency 1.0
一致性级别为1.0将保证一致的读取。我不确定是否有选项可以设置与LocalDatastoreHelper的一致性级别


同样,“实时”数据存储在所有情况下始终是一致的,除了我上面提到的少数例外情况

你最可能遇到的是——最终的一致性。默认情况下,数据存储模拟器模拟0.9的一致性。请注意,大多数查询最终都是一致的,除非WHERE子句是键或查询是祖先查询。我相信你是幸运的,“生活”商店返回结果。如果您在一天中的不同时间运行测试足够多的时间,那么它可能不会返回结果(这完全取决于更新索引的时间和时间)

这就是说,数据存储模拟器有一个选项来指定它应该模拟的一致性级别。这可以通过以下命令完成:

gcloud beta emulators datastore start --data-dir=/my/data/dir --host-port localhost:9999 --consistency 1.0
一致性级别为1.0将保证一致的读取。我不确定是否有选项可以设置与LocalDatastoreHelper的一致性级别


同样,“实时”数据存储在所有情况下始终是一致的,除了我上面提到的少数例外情况

为了不让人们对我最初的问题感到困惑,我回答自己,因为我们找到了问题的根源

不幸的是,live和local之间的差异并不是由于数据存储端的行为不同,而是源于我们的代码-(

就我所见,我们以前关于未生成索引的所有假设都是错误的。在这方面,local的行为与live完全相同


感谢您的贡献!

为了不让人们对我最初的问题感到困惑,我自己回答,因为我们找到了问题的根源

不幸的是,live和local之间的差异并不是由于数据存储端的行为不同,而是源于我们的代码-(

就我所见,我们以前关于未生成索引的所有假设都是错误的。在这方面,local的行为与live完全相同


感谢您的贡献!

感谢您的建议!我将研究一致性方面。感谢您的建议!我将研究一致性方面。