Подтвердить что ты не робот

App Datastore Viewer, как показать количество записей с помощью GQL?

Я бы подумал, что это будет легко для SQL-подобного! Я хочу получить эквивалент GQL:

select count(*) from foo;

и получить ответ, похожий на:

1972 records.

И я хочу сделать это в GQL из "командной строки" в веб-браузере DataStore. (Вы знаете, тот, который показывает 20 за один раз и позволяет мне видеть "следующие 20" )

В любом случае - я уверен, что это мозг мертв легко, я просто не могу найти правильный синтаксис. Любая помощь будет оценена.

Спасибо!

4b9b3361

Ответ 1

Как указано в другом questions, похоже, что нет count aggregate функции в GQL. GQL Reference также не говорит, что есть возможность сделать это, хотя он явно не говорит, что это невозможно.

В консоли разработки (при запуске приложения локально) выглядит просто щелчком по кнопке "Список объектов", которая отобразит список всех объектов определенного типа, и вы увидите "Результаты 1-10 из (некоторый номер )", чтобы получить общее количество в вашей среде разработки.

В процессе производства вы можете использовать вкладку "Статистика хранилища данных" (ссылка прямо под средством просмотра хранилища данных), выберите "Показать статистику для: (тип вашей сущности)", и она покажет вам общее количество объектов, однако это не самый свежий вид данных (обновляется "не реже одного раза в день" ).

Поскольку вы не можете запускать произвольный код в процессе производства через браузер, я не думаю, что использование "use .count() в запросе" поможет, но если вы используете Удаленный API, метод .count() больше не имеет 1000 записей по состоянию на август 2010 г., поэтому вы должны иметь возможность запускать print MyEntity.all().count() и получить желаемый результат.

Ответ 2

С прямой консолью Datastore Console нет способа direct, но я просто понял, как это сделать косвенно, с ключевым словом OFFSET.

Итак, учитывая таблицу, мы будем называть foo с полем типа, которое мы хотим проверить для значений с именем "bar":

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

(Мы будем делать быструю игру "теплее, холоднее" здесь, бинарный стиль)

Скажем, что запрос ничего не возвращает. Измените OFFSET на 512, затем 256, 128, 64,... вы получите эту идею. То же самое в обратном порядке: до 2048, 4096, 8192, 16384 и т.д., Пока вы не увидите никаких записей, затем отпустите.

Я только что сделал это на работе. Начал с 2048 года, и заметил, что появились две записи. В таблице 2049. В более экстремальном случае (скажем, там 3300 записей), вы можете начать с 2048, заметьте там много, перейдите к 4096, там нет... Возьмите среднюю точку (1024 между 2048 и 4096 - 3072) далее и обратите внимание на вас есть записи... Оттуда вы можете добавить половину предыдущей средней точки (512), чтобы получить 3584, и там нет. Whittle обратно вниз половину (256), чтобы получить 3328, все еще нет. Еще раз вниз (128), чтобы получить 3200 и там записи. Поднимитесь на половину последнего val (64), и там все еще записывается. Поднимитесь еще раз (32) до 3296 - все еще записывается, но настолько мало вы можете легко увидеть там ровно 3300.

Хорошая вещь об этой статистике данных Datastore, чтобы узнать, сколько записей в таблице, вы можете ограничить ее предложением WHERE.

Ответ 4

Это одна из тех удивительных вещей, которые не могут сделать хранилище данных. Я думаю, что самый быстрый способ сделать это - выбрать __KEY__ из foo в список, а затем подсчитать элементы в списке (которые вы не можете сделать в веб-браузере).

Если вы довольны статистикой, которая может быть немного устаревшей, вы можете перейти на страницу Datastore Statistics на консоли администратора, которая расскажет вам, сколько объектов каждого типа было некоторое время назад. Кажется, что эта статистика обычно составляет менее 10 часов. К сожалению, вы не можете запросить их более конкретно.

Ответ 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 или добавить пользовательскую страницу на свой сайт администратора для запуска этого запроса. Очевидно, если у вас есть миллионы строк, вы будете ждать некоторое время. Возможно, вы сможете увеличить max_fetch, я не уверен, каков текущий предел выборки.