web-dev-qa-db-ja.com

App Engine Datastore Viewer、GQLを使用してレコードの数を表示する方法は?

私は考えるこれはSQLのように簡単でしょう!私が欲しいのは、GQLに相当するものです。

select count(*) from foo;

そして、次のような答えを返すには:

1972 records.

そして、Webベースのデータストアビューアの「コマンドライン」からGQLでこれを実行したいと思います。 (一度に20が表示され、「次の20」が表示されるものです)

とにかく-私はそれが非常に簡単だと確信しています、私は正しい構文を見つけることができないようです。どんな助けでもいただければ幸いです。

ありがとう!

24
Olie

otherquestions で述べられているように、GQLにはcount集計関数がないようです。 GQLリファレンス も、これを実行できるとは言っていませんが、それが不可能であるとは明示的には述べていません。

開発コンソール(アプリケーションをローカルで実行)では、[エンティティのリスト]ボタンをクリックするだけで、特定のタイプのすべてのエンティティのリストが表示され、「(いくつかの)の結果1〜10」が表示されます。開発環境の合計数を取得します。

本番環境では、[データストア統計]タブ(データストアビューアのすぐ下のリンク)を使用して、[統計の表示:(エンティティタイプ)]を選択すると、エンティティの総数が表示されますが、これは最新ではありません。データの表示(「少なくとも1日に1回」更新)。

ブラウザを介して本番環境で任意のコードを実行することはできないため、「クエリで.count()を使用する」と言っても役に立たないと思いますが、使用している場合は リモートAPI.count()メソッドは 2010年8月の時点で1000エントリに制限されなくなりました なので、print MyEntity.all().count()を実行して結果を取得できるはずです。あなたが欲しい。

13
JJ Geewax

ストレートのデータストアコンソールでは、directの方法はありませんが、OFFSETキーワードを使用して、間接的に行う方法を理解しました。

したがって、テーブルが与えられた場合、「bar」という名前の値をチェックするtypeというフィールドを使用してfooを呼び出します。

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

(ここでは、「暖かい、冷たい」、バイナリスタイルの簡単なゲームを行います)

クエリが何も返さないとしましょう。 OFFSETを512に変更してから、256、128、64、...と思います。逆に同じことです。レコードが表示されなくなるまで2048、4096、8192、16384などに移動してから、元に戻します。

私はここで仕事をしました。 2048から始まり、2つのレコードが出てきたことに気づきました。テーブルには2049があります。より極端なケースでは(3300レコードがあるとしましょう)、2048から始めて、たくさんあることに気づき、4096に進み、何もありません...次に中間点(2048と4096の間の1024は3072)を取り、あなたに気づきますレコードがあります...そこから、前の中間点(512)の半分を追加して3584を取得できますが、何もありません。半分(256)に戻って、3328を取得しますが、まだありません。もう一度半分(128)下がって3200を取得し、レコードがあります。最後の値(64)の半分を上に移動しても、まだレコードがあります。もう一度半分(32)上がって3296になります-まだ記録されていますが、非常に小さいので、正確に3300があることが簡単にわかります。

テーブル内のレコード数を確認するためのこの統計とデータストア統計の良い点は、WHERE句で制限できることです。

32
RodneyReid

GQLを介してエンティティの数を取得する直接的な方法はないと思います。ただし、ダッシュボードから直接カウントを取得できます。

enter image description here

詳細--- https://cloud.google.com/appengine/docs/python/console/managing-datastore

12
Aniket Thakur

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を使用してこの関数を実行するか、管理サイトに カスタムページ を追加してこのクエリを実行できます。明らかに、何百万もの行がある場合は、しばらく待つことになります。 max_fetchを増やすことができるかもしれませんが、現在のフェッチ制限が何であるかはわかりません。

0
Calvin

これは、データストアでは実行できない驚くべきことの1つです。これを行う最も速い方法は、fooから__KEY__を選択してリストに入れ、リスト内のアイテムを数えることだと思います(これは、Webベースのビューアーでは実行できません)。

少し古くなっている可能性のある統計に満足している場合は、管理コンソールの[データストア統計]ページに移動すると、各タイプのエンティティが以前にいくつあったかがわかります。これらの統計は通常10時間未満のもののようです。残念ながら、それらをより具体的に照会することはできません。

0
Riley Lark