Google App Engine (Python): Лепшы спосаб вызначыць, калі запыт вяртае вынікі ці няма

Я выкарыстоўваю рамкі WebAPP на GAE, і паказаць вынікі запыту, я раблю 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
    # ...

Прычына, чаму я раблю ГЭТ (), а не проста рабіць яшчэ на цыкл, таму што я выснова дадзеных у выглядзе табліцы, і я не хачу, каб напісаць код табліцы, калі няма вынікаў. Раней замест ГЭТ() я рабіў выбарку (1), але я лічу, што яны эквівалентныя (г.зн., атрымліваем() проста выконвае запыт, але з не больш аднаго выніку). У гэтым і заключаецца маё пытанне - гэта праўда, што я магу выкарыстоўваць Get() такім чынам, і гэта лепшы спосаб зрабіць даведацца, калі запыт вяртае вынікі ці не? Мог бы разлічваць (1) быць лепш?

Я не звязаны з колькасцю вынікаў, толькі калі яны ёсць, ці не.

0

4 адказы

Проста выклічце выняць , каб атрымаць колькасць вынікаў вам трэба, то ітэрацыю над імі. Напрыклад:

query = Employee.all().filter("some_boolean_property = ", True)
results = query.fetch(20)
if results:
    for employee in results:
        # Do stuff
1
дададзена
Так, але я хачу, каб перабрацца ўсе вынікі, так што калі я не дам выбаркі() аргумент, які быў бы іншы доступ да сховішча дадзеных. Калі я не выкарыстаў выбаркі (1), каб убачыць, ці ёсць якія-небудзь дадзеныя (які быў мой першапачатковы пытанне, калі прынесці (1) ці атрымаць() быў добры спосаб зрабіць гэта ці не)
дададзена аўтар Dave Hollingworth, крыніца
Згодны, але пакуль Google не дазваляе паўнатэкставага пошуку, я падманваю, загрузіўшы ўсе вынікі, а затым з дапамогай DataTable зрабіць нумарацыю старонак і пошук лакальна на кліенце ... праўда, гэта будзе працаваць толькі тады, калі выніковы набор малы (што гэта на дадзены момант - мы спадзяемся, Google будзе рабіць гэта ў бліжэйшы час, хоць, але гэта іншая тэма :-)
дададзена аўтар Dave Hollingworth, крыніца
@fishwebby Там павінна быць практычнае абмежаванне на колькі вынікаў вы хочаце адлюстраваць карыстальнікаў на адной старонцы. Старонка з 1000 або 10000 або 100000 вынікаў на ім не асабліва карысна для ўсіх.
дададзена аўтар Nick Johnson, крыніца

Вы можаце выкарыстоўваць Query класа Колькасць метад. Калі вы падасце мяжа гэта будзе толькі праверыць, што шмат. Вось прыклад:

query = Employee.all().filter("some_boolean_property = ", True)
if query.count(limit=1):
   for employee in query:
       pass
0
дададзена
Гэта будзе толькі прынесці кошт замест ўключэння дадзеных сутнасцяў ў адваротным. Ён будзе рабіць два RPC выклікаў, але мае важнае значэнне ў тым выпадку, калі вы будзеце толькі зрабіць другую выбарку на аснове вынікаў падліку.
дададзена аўтар Matt Williamson, крыніца
А добра - так, як бы гэта параўнаць рабіць выбарку (1) ці атрымаць() на запыт?
дададзена аўтар Dave Hollingworth, крыніца
Гэта будзе па-ранейшаму патрабуе двух выклікаў RPC, калі патрабуецца толькі адзін.
дададзена аўтар Nick Johnson, крыніца

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

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
    # ...

Гэта мае тое перавага, што выдаленне выкліку ў сховішча.

0
дададзена
Мне падабаецца - хоць гэта робіць мой код трохі больш шматслоўным ён мае перавагу, як вы кажаце, выдаленне дадатковага выкліку сховішчы дадзеных. Дзякуй!
дададзена аўтар Dave Hollingworth, крыніца

«Колькасць» вяртае толькі колькасць вынікаў, знойдзеных па запыце

«Атрымаць» і «атрымліваць» вяртае ўвесь аб'ект

так што «лічыльнік» з'яўляецца значна больш эфектыўным, калі вы хочаце толькі падлік запыту

Акрамя таго, я не бачу, чаму людзі бягуць цыкл пасля запыту па 1 ст. Калі вы выкарыстоўваеце атрымаць (), вы будзеце атрымліваць толькі 1 элемент, які адпавядае так што вам не патрэбны цыкл. Усё, што вы на самай справе праверыць, калі вы атрымалі фактычны аб'ект або адлічыць таму з запыту.

0
дададзена
OP хоча, каб паказаць вынікі ў дадатак да ведаў, калі такія маюцца.
дададзена аўтар Nick Johnson, крыніца
@fishwebby - Калі вы хочаце, каб усе вынікі, то вы павінны атрымліваць столькі, колькі вы можаце (я думаю, што 100 гэта правіла для GAE) з'яўляецца вы лічыце, што будзеце больш, тое, што я лічу, выкарыстоўваць зрушэнне з выбаркай. Калі няма ніякіх вынікаў Вы не атрымаеце «Не», і вы проста праверыць з, калі заяву, перш чым ісці ў пятлю. Там няма неабходнасці выкарыстання рахункі, калі вы хочаце, каб вярнуць аб'екты.
дададзена аўтар JBourne, крыніца