对于测试,我们使用Google提供的LocalDatastoreHelper类启动cloud-datastore-emulator的本地实例。
我们做的有趣的观察是,我们可以使用我们的代码插入数据,然后通过执行GQL查询再次找到它
SELECT [..] WHERE myfield = true
如果我们针对在Google Cloud上托管的“实时”商店进行此操作。
可是:
当我们针对本地运行的模拟器运行相同的代码时,插入工作正常,但查询却没有。 findAll()工作正常,所以看起来像插入和读取工作一般,但不知何故索引丢失了?
现在阅读文档数小时后,我没有找到任何提示,为什么会发生这种情况。
有人可以帮忙吗?
答案 0 :(得分:2)
您最常遇到的是 - 最终的一致性。默认情况下,数据存储模拟器模拟0.9的一致性。请注意,除非WHERE子句是Key或查询是Ancestor Query,否则大多数查询最终都是一致的。我相信你很幸运,#34;生活"商店正在返回结果。如果您在一天中的不同时间运行测试足够多次,则可能无法返回结果(这一切都取决于更新索引所需的时间和时间)。
也就是说,数据存储模拟器可以选择指定它应该模拟的一致性级别。这可以使用以下命令完成:
gcloud beta emulators datastore start --data-dir=/my/data/dir --host-port localhost:9999 --consistency 1.0
1.0的一致性级别将保证一致的读取。我不确定是否可以选择使用LocalDatastoreHelper设置一致性级别。
再一次,"直播"除了上面提到的少数例外情况之外,数据存储总是最终符合所有情况。
答案 1 :(得分:0)
为了不让人们与我原来的问题混淆,我回答自己,因为我们找到了问题的根源。
不幸的是,实时和本地之间的区别不是由于数据存储区一侧的行为有所不同,而是根植于我们的代码中。 : - (
据我所知,我们之前关于未生成索引的所有假设都是错误的。在这方面,本地行为与现实完全一样。
感谢您的贡献!