Google App Engine (python): Bir so'rov natijalarini aniq yoki yo'qligini aniqlashning eng yaxshi usuli

GAE-da webapp tizimidan foydalanmoqdaman va so'rovlar natijalarini ko'rsatish uchun so'rovlar ob'ektida get() qilaman, keyin uni qaytarib olib,() qaytarib olsam, masalan:

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() funktsiyasini bajarish sababli, faqatgina for loopida boshqa biror narsa qilmaslik sababli, men jadvaldagi ma'lumotlarni chiqarmoqdaman va natija bo'lmasa jadval kodini yozishni xohlamayman. Avvalgi get() o'rniga gett (1) ni amalga oshirgan edim, lekin bunga ekvivalent (ya'ni, get() faqat so'rovni bajaradi, lekin maksimal natija bilan ishlaydi) deb o'ylayman. U erda mening savolim yotadi - bu holda get() funktsiyasidan foydalanishim mumkinmi va bu so'rov natijalarni keltirib chiqarmayaptimi yoki yo'qmi buni aniqlashning eng yaxshi yo'li? (1) yaxshiroq bo'lishi mumkinmi?

Men natijalar sonidan xavotirlanmayapman, agar bor bo'lsa yoki yo'q bo'lsa.

0

4 javoblar

Sizga kerakli natijalarni olish uchun faqat get -ni chaqirib oling, keyin ularni yineleyin. Misol uchun:

query = Employee.all().filter("some_boolean_property = ", True)
results = query.fetch(20)
if results:
    for employee in results:
        # Do stuff
1
qo'shib qo'ydi
Ha, lekin men barcha natijalar ustidan yineleme qilishni istayman, shuning uchun (agar) argumentni keltirmasam, bu datastore uchun yana bir imkoniyat bo'ladi. Hech qanday ma'lumot yo'qligini bilish uchun (1) oldindan foydalanmasam (aslida bu mening savolim bo'lganmi, agar (1) yoki() buni qilishning yaxshi yo'li bo'lsa,
qo'shib qo'ydi muallif Dave Hollingworth, manba
Kelgusida, Google to'liq matn terish imkoniyatini yaratgunga qadar barcha natijalarni yuklash orqali aldab qo'yaman, so'ngra ma'lumotni paginatsiya qilishni va mijozni mahalliy sifatida qidirishni ishlataman ... shubhasiz, bu faqat natija majmui kichik bo'lsa (u hozirda - umid qilamanki, Google yaqin orada buni amalga oshiradi, ammo bu boshqa mavzu :-)
qo'shib qo'ydi muallif Dave Hollingworth, manba
@fishwebby Bitta sahifada foydalanuvchilarga ko'rsatishni istagan natijalar haqida amaliy cheklov bo'lishi kerak. 1000 yoki 10,000 yoki 100,000 natijaga ega bo'lgan sahifa hech kim uchun foydali emas.
qo'shib qo'ydi muallif Nick Johnson, manba

So'rovlar sinfining count usulini ishlatishingiz mumkin. Agar siz limit ni taqdim qilsangiz, u faqat ko'pchilikni tekshiradi. Mana bir misol:

query = Employee.all().filter("some_boolean_property = ", True)
if query.count(limit=1):
   for employee in query:
       pass
0
qo'shib qo'ydi
Bu faqat hisobdagi obyekt ma'lumotlarini kiritish o'rniga, hisobni oladi. Ikki RPC chaqiruvini amalga oshiradi, ammo hisoblash natijalari asosida faqat ikkinchi marta bajarishingiz kerak bo'lgan holatda kerak.
qo'shib qo'ydi muallif Matt Williamson, manba
Ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
qo'shib qo'ydi muallif Dave Hollingworth, manba
Bu faqat bitta RPC kerak bo'lsa, faqat bitta talab qilinadi.
qo'shib qo'ydi muallif Nick Johnson, manba

Buning muqobilida loop ichida bayroq o'rnatish uchun hech bo'lmaganda bitta yozuv topilgan deb aytish mumkin, keyin "yozuvlar topilmadi" xodimi uchun ushbu bayroqni sinab ko'rsating.

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

Buning uchun datastorega qo'ng'iroqni o'chirish afzalligi bor.

0
qo'shib qo'ydi
Men buni yaxshi ko'raman - bu mening kodimni biroz chuqurroq qilishiga qaramay, siz qo'shimcha ma'lumotlarning chaqirilishini olib tashlash kabi sizning afzalliklarga ega. Rahmat!
qo'shib qo'ydi muallif Dave Hollingworth, manba

'count' so'rov bilan topilgan natijalar sonini qaytaradi

"olish" va "qabul qilish" butun mavjudotni qaytarib beradi

shuning uchun agar "so'rov" faqatgina so'rovlar sonini ko'rishni istasangiz, "hisoblash" juda samarali

Bundan tashqari, odamlar nima uchun 1 ta element uchun so'rovdan so'ng loopni ishlayotganini ko'rmayapman. Get() funktsiyasidan foydalansangiz, siz faqatgina 1 ta elementni olasiz, shuning uchun siz loopga muhtoj emassiz. Haqiqatan ham, siz haqiqatan ham tekshirasiz. Agar siz haqiqiy shaxsni qabul qilsangiz yoki so'rovdan qaytib hisoblasangiz.

0
qo'shib qo'ydi
OP o'shanda natijalarni ko'rsatishni istaydi.
qo'shib qo'ydi muallif Nick Johnson, manba
@fishwebby - Agar siz barcha natijalarni olishni istasangiz, imkon qadar ko'plarni olib kelishingiz kerak (menimcha, 100 - GAE uchun bosh qoidalardir) siz undan ko'p narsaga ega bo'lishingizga ishonasizmi? Hech qanday natija bo'lmasa, siz "yo'q" ni qabul qilasiz va faqatgina loopga kirmasdan oldin if iboralari bilan sinab ko'rasiz. Ob'ektlarni qaytarib olishni istasangiz, hisob-kitob qilish kerak emas.
qo'shib qo'ydi muallif JBourne, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming