App Engine数据存储查看器,如何使用GQL显示记录数?

时间:2011-02-12 17:09:31

标签: google-app-engine gql

我会认为对于类似SQL来说这很容易!我想要的是GQL相当于:

select count(*) from foo;

并得到类似的答案:

1972 records.

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

无论如何 - 我确定这很容易让人脑子死,我似乎无法找到正确的语法。任何帮助将不胜感激。

谢谢!

5 个答案:

答案 0 :(得分:29)

使用直接的数据存储控制台,没有直接方式,但我只是想办法用OFFSET关键字间接地做到这一点。

因此,给定一个表格,我们将调用foo,其中包含一个名为type的字段,我们要检查名为&#34的值; bar":

inset

(我们正在做一个快速游戏"温暖,冷静"这里,二进制风格)

让我们说查询什么也不返回。将OFFSET改为512,然后改为256,128,64 ......你明白了。同样的事情反过来:一直到2048,4096,8192,16384等,直到你看不到记录,然后退回。

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

关于这个与数据存储区统计信息的好处,看看表中有多少条记录,你可以通过WHERE子句来限制它。

答案 1 :(得分:12)

正如other questions中所述,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()并获得所需的结果。

答案 2 :(得分:12)

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

enter image description here

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

无法获得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,我不确定当前的提取限制是什么。