App Engine Datastore Viewer,如何使用 GQL 显示记录数?

Posted

技术标签:

【中文标题】App Engine Datastore Viewer,如何使用 GQL 显示记录数?【英文标题】:App Engine Datastore Viewer, how to show count of records using GQL? 【发布时间】:2011-06-26 03:32:14 【问题描述】:

我会认为这对于类似 SQL 的人来说很容易!我想要的是 GQL 等价物:

select count(*) from foo;

并获得类似于以下内容的答案:

1972 records.

我想在 GQL 中通过基于 Web 的 DataStore 查看器中的“命令行”执行此操作。 (你知道,一次显示 20 个并让我看到“下一个 20”)

无论如何——我确信这很容易,我只是似乎找不到正确的语法。任何帮助将不胜感激。

谢谢!

【问题讨论】:

如果你关注我的链接,还有另一个线程有很多关于编写 gql 的讨论。 count(*) 不是有效的 gql,并且该线程上有大量解释。至于运行该 gql,您的本地部署有一个 dev console 和一个名为 Interactive Console 的区域,可让您执行代码。从from google.appengine.ext import db开始... What's the best way to count results in GQL?的可能重复 【参考方案1】:

使用直接的 Datastore 控制台,没有 直接 方法可以做到这一点,但我只是想出了如何使用 OFFSET 关键字间接做到这一点。

因此,给定一个表,我们将调用 foo,其中包含一个名为 type 的字段,我们要检查名为“bar”的值:

SELECT * FROM foo WHERE type="bar" OFFSET 1024

(我们将在这里做一个“温暖,寒冷”的快速游戏,二进制风格)

假设查询不返回任何内容。将 OFFSET 更改为 512,然后更改为 256、128、64,......你明白了。反过来也是一样的:向上到 2048、4096、8192、16384 等,直到看不到任何记录,然后退出。

我刚在这里工作时做了一个。从 2048 年开始,注意到出现了两条记录。表中有 2049。在更极端的情况下,(假设有 3300 条记录),您可以从 2048 开始,注意有很多,转到 4096,没有...接下来取中点(2048 和 4096 之间的 1024 是 3072)并注意您有记录...从那里你可以加上前一个中点的一半 (512) 得到 3584,但没有。减半 (256) 得到 3328,仍然没有。再次下降一半(128),获得 3200 并且有记录。上升最后一个 val (64) 的一半,仍然有记录。再次上升一半 (32) 到 3296 - 仍然是记录,但太小了,您可以很容易地看到正好是 3300。

与数据存储区统计数据相比,查看表中有多少记录的好处是您可以通过 WHERE 子句对其进行限制。

【讨论】:

喜欢OFFSET的建议,很有用! 偏移建议和二分搜索是个好主意!每次管理都需要一些随机统计数据时,不再需要导出到大查询... :) 在处理大型集合时要记住 OFFSET 的一点是(只要您不使用游标)它只会丢弃结果集中的实体,因此它不是“真正的“ 抵消。这意味着 1) 您需要为包括偏移量在内的 所有 读取操作付费,以及 2) 响应时间将线性减慢。例如,使用offset 1000000 的查询会非常慢,并且您需要支付所有 1000000 次读取操作。 这真的很有帮助。此外,您可以继续查看底部分页。一旦你离得太近,它就会开始显示最接近的值而不是'of many'。【参考方案2】:

我认为没有任何直接的方法可以通过 GQL 获取实体的数量。但是,您可以直接从仪表板获取计数 ;

更多详情 - https://cloud.google.com/appengine/docs/python/console/managing-datastore

【讨论】:

【参考方案3】:

正如otherquestions 中所述,GQL 中似乎没有 count 聚合函数。 GQL Reference 也没有说有能力做到这一点,尽管它没有明确说这是不可能的。

在开发控制台(在本地运行您的应用程序)中,看起来只需单击“列出实体”按钮就会向您显示特定类型的所有实体的列表,并且您可以看到“结果 1-10(一些数字)" 以获取您的开发环境中的总数。

在生产中,您可以使用“数据存储统计”选项卡(数据存储查看器下方的链接),选择“显示统计信息:(您的实体类型)”,它会显示实体的总数,但这是不是最新的数据视图(“每天至少更新一次”)。

由于您不能通过浏览器在生产环境中运行任意代码,我认为“在查询中使用.count()”不会有帮助,但如果您使用的是the Remote API,则.count() 方法是no longer capped at 1000 entries as of August, 2010,所以你应该可以运行print MyEntity.all().count()并得到你想要的结果。

【讨论】:

MyEntity.all().count() 不会让你超过 1,000。您可以将更高的限制作为count() 的参数,但谷歌警告您这可能是time you out。 "count() 没有最大限制。如果您不指定限制,数据存储将继续计数,直到完成计数或超时。" 正如您链接的answer 中的cmets 解释,您需要强制限制高于1,000。在交互式控制台中很容易测试。试一试。 不知道显示实体计数的“数据存储统计”视图。谢谢!【参考方案4】:

这是数据存储无法做到的令人惊讶的事情之一。我认为最快的方法是从 foo 中选择 __KEY__ 到一个列表中,然后计算列表中的项目(这在基于 Web 的查看器中是无法做到的)。

如果您对可能有点陈旧的统计数据感到满意,您可以转到管理控制台的数据存储区统计信息页面,该页面会告诉您一段时间前每种类型的实体数量。似乎这些统计数据通常不到 10 小时。不幸的是,您无法更具体地查询它们。

【讨论】:

获取和计数键永远不会超过 1,000。我链接到的线程讨论了:) 我不确定您是否正确。返回计数可能仍有一些限制,但我确信 1000 个实体的上限已被删除。无论哪种方式,这是一种缓慢的计数方式,而预先计算是一种更快的方式。 是的,绝对慢,而且你不想超时。抱歉,我说的不准确,我的意思是 count() 不会返回 1,000 以上。在交互式控制台中尝试db.GqlQuery('select __key__ from YourEntity').count(),您将不会超过 1,000。您可以通过限制 count() 使其高于 1,000,但我同意,这不是一个很好的解决方案。【参考方案5】:

在 GQL 中无法获得总计数。这是一种使用 python 获取计数的方法:

def count_models(model_class, max_fetch=1000):
  total = 0
  cursor = None
  while True:
    query = model_class.all(keys_only=True)
    if cursor: 
        query.with_cursor(cursor)
    results = query.fetch(max_fetch)
    total += len(results)
    print('still counting: ' + total)
    if (len(results) < max_fetch):
        return total
    cursor = query.cursor()

您可以使用 remote_api_shell 运行此功能,或将custom page 添加到您的管理站点以运​​行此查询。显然,如果您有数百万行,您将等待一段时间。您也许可以增加 max_fetch,我不确定当前的 fetch 限制是多少。

【讨论】:

以上是关于App Engine Datastore Viewer,如何使用 GQL 显示记录数?的主要内容,如果未能解决你的问题,请参考以下文章

App Engine 上 Cloud Datastore 的客户端库 - NDB 或 google-cloud-datastore

Google App Engine Datastore 中的索引和索引条目限制

Google App Engine 中的 Datastore 与 Cloud SQL

Google App Engine Datastore 集成测试

App Engine Datastore Viewer,如何使用 GQL 显示记录数?

如何在 Google App Engine 的 Datastore 模型中获取行数?