Google app engine 管理数据存储查看器中的应用程序引擎查询返回与编程查询不同的结果

Google app engine 管理数据存储查看器中的应用程序引擎查询返回与编程查询不同的结果,google-app-engine,google-cloud-datastore,models,Google App Engine,Google Cloud Datastore,Models,我很困惑 今天我注意到一些我认为应该出现在我的appengine应用程序中的数据没有显示出来。我通过远程控制台连接到应用程序,并手动运行查询。果然,在我期待看到的101行中,我只看到了15行 然后,我转到appengine.google.com上的管理控制台,用以下查询启动数据存储查看器: SELECT * FROM Assignment where game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')

我很困惑

今天我注意到一些我认为应该出现在我的appengine应用程序中的数据没有显示出来。我通过远程控制台连接到应用程序,并手动运行查询。果然,在我期待看到的101行中,我只看到了15行

然后,我转到appengine.google.com上的管理控制台,用以下查询启动数据存储查看器:

SELECT * FROM Assignment where game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')
我看到的结果是20个结果的第一页。我翻阅这些结果,能够看到所有101个实体。好极了我的数据还在那里。但是为什么我不能通过db api访问它呢?(注意:我已经尝试过通过memcache查看器清除memcache,即使这个查询不是手动memcache的)

从远程控制台:

> from google.appengine.ext.db import GqlQuery
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')").count()
15
远程控制台同意应用程序本身,它似乎只能看到预期的101行中的15行

有什么好处

更新

我怀疑这可能是一个索引问题。如果我为其中一个缺少的行发出get_by_key_name,它随后会显示在db api查询中

> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')").count()
15
> entities.Assignment.get_by_key_name('201212-assignment-135.9')
<entities.Assignment object at 0xa11eb6c>
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')").count()
16
但是,如果我发出此查询10次,大约有一半的时间返回“坏”结果:

> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb') and user = 'zee'").count()
16
因此,可能是因为我有一半的时间碰到了一个坏的/隐藏在bigtable副本后面的问题,或者是我们无法得到答案的其他完全不透明的问题(appengine今天确实列出了一个服务中断),但我感觉这将自行修复。如果有,将再次更新

最终更新

正如我所怀疑的,当我今天早上醒来时,我的应用程序(和手动查询)现在看到了一致、正确的数据视图。我仍然很想知道为什么会发生这种情况,但在我得到答案之前,我将把它归咎于谷歌内部的bigtable古怪


我对appengine提出了异议,想看看我是否能从知情人士那里得到答案。

对于人力资源开发应用程序,这是按预期进行的。App Engine高复制数据存储(HRD)在多个数据中心同步存储数据。但是,从提交写入到写入在所有数据中心可见的延迟意味着跨多个实体组的查询(非祖先查询)只能保证结果。[1]

在您的特定情况下,应用程序和管理控制台数据存储查看器的结果之间的差异只是因为它们很可能是从具有不同一致性的不同数据存储服务器读取的

如果您需要一致的数据视图,我建议您仔细阅读本文


[1]

我的应用程序也遇到同样的问题。DatastoreViewer中的数据存储查询返回一组对象:SELECT*FROM Article,但脚本中的articles=Article.query()不返回任何内容。
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb') and user = 'zee'").count()
16