我会认为对于类似SQL来说这很容易!我想要的是GQL相当于:
select count(*) from foo;
并得到类似的答案:
1972 records.
我想从基于Web的DataStore查看器中的“命令行”在GQL中执行此操作。 (你知道,一次显示20个,让我看到“下一个20”)
无论如何 - 我确定这很容易让人脑子死,我似乎无法找到正确的语法。任何帮助将不胜感激。
谢谢!
答案 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获取计数 ;
更多详情 - 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,我不确定当前的提取限制是什么。