Google App Engine (python): лучший способ определить, возвращает ли запрос результаты или нет - PullRequest
0 голосов
/ 28 октября 2011

Я использую каркас веб-приложения на GAE, и чтобы показать результаты запроса, я делаю get () для объекта запроса, затем выполняю итерации по нему, если get () возвратил что-нибудь, например:

query = Employee.all().filter("some_boolean_property = ", True)
if query.get():
    for employee in query:
        # output employee.name etc.
        # ...
else:
    # output "no records found" message
    # ...

Причина, по которой я выполняю get (), а не просто выполняю else в цикле for, заключается в том, что я выводю данные в таблицу и не хочу писать код таблицы, если нет Результаты. Ранее вместо get () я делал fetch (1), но я считаю, что они эквивалентны (то есть get () просто выполняет запрос, но с максимум одним результатом). В этом и заключается мой вопрос - верно ли то, что я могу использовать get () таким образом, и это лучший способ выяснить, возвращает ли запрос результаты или нет? Может ли счет (1) быть лучше?

Меня не интересует количество результатов, просто есть они или нет.

Ответы [ 4 ]

1 голос
/ 01 ноября 2011

Просто позвоните fetch, чтобы узнать количество нужных вам результатов, а затем выполните итерации по ним. Например:

query = Employee.all().filter("some_boolean_property = ", True)
results = query.fetch(20)
if results:
    for employee in results:
        # Do stuff
0 голосов
/ 28 октября 2011

Вы можете использовать метод count класса Query.Если вы предоставите limit, он будет проверять только столько.Вот пример:

query = Employee.all().filter("some_boolean_property = ", True)
if query.count(limit=1):
   for employee in query:
       pass
0 голосов
/ 31 октября 2011

'count' возвращает только количество результатов, найденных по запросу

«get» и «fetch» ​​возвращают всю сущность

так что 'count' намного эффективнее, если вы хотите только количество запросов

Также я не понимаю, почему люди запускают цикл после запроса для 1 элемента. Если вы используете get (), вы получите только 1 соответствующий элемент, поэтому вам не нужен цикл. Все, что вы действительно проверяете, так это то, что вы действительно получили объект или рассчитываете обратно из запроса.

0 голосов
/ 28 октября 2011

Альтернативой может быть установить флаг внутри цикла, чтобы сказать, что найдена хотя бы одна запись, а затем проверить этот флаг для вашего случая «нет записей».

found = False
query = Employee.all().filter("some_boolean_property = ", True)
for employee in query:
    found = True
    # output employee.name etc.
    # ...
if not found:
    # output "no records found" message
    # ...

Это имеет преимуществоудаления звонка в хранилище данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...