Query cursor memungkinkan aplikasi mengambil hasil kueri dalam batch yang mudah, dan lebih direkomendasikan daripada penggunaan offset bilangan bulat untuk penomoran halaman. Lihat Kueri untuk mengetahui informasi selengkapnya tentang pembuatan struktur kueri untuk aplikasi Anda.
Query Cursor
Query Cursor memudahkan aplikasi mengambil hasil kueri dalam batch
tanpa menimbulkan overhead offset kueri. Setelah melakukan
operasi pengambilan, aplikasi dapat memperoleh
kursor, yang merupakan string yang dienkode sebagai base64 bersifat opaque yang menandai posisi indeks
hasil terakhir yang diambil. Aplikasi dapat menyimpan string ini, misalnya di
Datastore, di Memcache, di payload tugas Task Queue, atau disematkan di
halaman web sebagai parameter GET
atau POST
HTTP, dan dapat menggunakan kursor sebagai titik awal untuk operasi pengambilan berikutnya guna mendapatkan batch hasil berikutnya dari titik akhir pengambilan sebelumnya. Pengambilan juga dapat
menentukan kursor akhir untuk membatasi sejauh mana kumpulan hasil yang ditampilkan.
Offset versus kursor
Meskipun Datastore mendukung offset bilangan bulat, Anda harus menghindari penggunaannya. Sebagai gantinya, gunakan kursor. Penggunaan offset hanya akan menghindari ditampilkannya entity yang dilewati ke aplikasi Anda, tetapi entity ini masih diambil secara internal. Entity yang dilewati memengaruhi latensi kueri dan aplikasi Anda akan dikenai biaya untuk operasi baca yang diperlukan untuk mengambil dokumen tersebut. Dengan menggunakan kursor, bukan offset, Anda dapat menghindari semua biaya ini.
Contoh query cursor
Di Python, aplikasi memperoleh kursor setelah mengambil hasil kueri dengan
memanggil metode cursor()
objek Query
. Untuk
mengambil hasil tambahan dari titik kursor, aplikasi
akan menyiapkan kueri serupa dengan jenis, memfilter, dan menata urutan entity yang sama,
serta meneruskan kursor ke
kueri with_cursor()
sebelum melakukan
pengambilan:
from google.appengine.api import memcache
from google.appengine.ext import db
# class Person(db.Model): ...
# Start a query for all Person entities
people = Person.all()
# If the application stored a cursor during a previous request, use it
person_cursor = memcache.get('person_cursor')
if person_cursor:
people.with_cursor(start_cursor=person_cursor)
# Iterate over the results
for person in people:
# Do something
# Get updated cursor and store it for next time
person_cursor = people.cursor()
memcache.set('person_cursor', person_cursor)
Batasan kursor
Kursor tunduk pada batasan berikut:
- Kursor hanya dapat digunakan oleh aplikasi yang sama yang menjalankan kueri asli, dan hanya untuk melanjutkan kueri yang sama. Untuk menggunakan kursor dalam operasi pengambilan berikutnya, Anda harus menyusun ulang kueri asli dengan tepat, termasuk jenis entity, filter ancestor, filter properti, dan tata urutan yang sama. Anda tidak dapat mengambil hasil menggunakan kursor tanpa menyiapkan kueri yang sama dengan yang awalnya dibuat.
- Karena operator
!=
danIN
diimplementasikan dengan beberapa kueri, kueri yang menggunakannya tidak mendukung kursor. - Kursor tidak selalu berfungsi seperti yang diharapkan dengan kueri yang menggunakan filter ketidaksetaraan atau tata urutan pada properti dengan beberapa nilai. Logika de-duplikasi untuk properti multi-nilai tersebut tidak akan dipertahankan di antara pengambilan, yang mungkin menyebabkan hasil yang sama ditampilkan lebih dari sekali.
- Rilis App Engine baru dapat mengubah detail implementasi internal, sehingga membatalkan validasi kursor yang bergantung padanya. Jika aplikasi mencoba menggunakan kursor yang tidak lagi valid, Datastore akan memunculkan pengecualian
BadRequestError
.
Kursor dan pembaruan data
Posisi kursor ditentukan sebagai lokasi dalam daftar hasil setelah hasil terakhir ditampilkan. Kursor bukan merupakan posisi relatif dalam daftar (bukan offset); kursor adalah penanda yang dapat dilewati Datastore saat memulai pemindaian indeks untuk mendapatkan hasil. Jika hasil kueri berubah di antara penggunaan kursor, kueri hanya akan melihat perubahan yang terjadi dalam hasil setelah kursor. Jika hasil baru muncul sebelum posisi kursor untuk kueri, hasil tersebut tidak akan ditampilkan jika hasilnya baru muncul setelah kursor diambil. Demikian pula, jika suatu entity bukan lagi hasil kueri, tetapi telah muncul sebelum kursor, hasil yang muncul setelah kursor tidak berubah. Jika hasil terakhir yang ditampilkan dihapus dari kumpulan hasil, kursor masih mengetahui cara menemukan hasil berikutnya.
Saat mengambil hasil kueri, Anda dapat menggunakan kursor awal dan kursor akhir untuk menampilkan grup hasil berkelanjutan dari Datastore. Saat menggunakan kursor awal dan akhir untuk mengambil hasil, tidak ada jaminan bahwa ukuran hasilnya akan sama seperti saat membuat kursor. Entity dapat ditambahkan atau dihapus dari Datastore antara saat kursor dibuat dan saat kursor digunakan dalam kueri.
Apa langkah selanjutnya?
- Pelajari cara menentukan hasil yang ditampilkan kueri dan mengontrol hasil kueri lebih lanjut.
- Pelajari batasan umum untuk kueri di Datastore.
- Pahami konsistensi data dan cara kerja konsistensi data pada berbagai jenis kueri di Datastore.
- Pelajari sintaksis dan struktur dasar kueri untuk Datastore.