Catatan: Developer yang membangun aplikasi baru sangat dianjurkan untuk menggunakan Library Klien NDB, yang memiliki beberapa manfaat jika dibandingkan dengan library klien ini, seperti caching entity otomatis melalui Memcache API. Jika saat ini Anda menggunakan Library Klien DB versi lama, baca Panduan Migrasi DB ke NDB
Query
class mewakili kueri untuk mengambil entity dari App Engine Datastore. (Lihat juga GqlQuery
class terkait, yang menentukan kueri menggunakan GQL, bahasa kueri yang mirip SQL.)
Query
ditentukan dalam modul google.appengine.ext.db
.
Catatan: Mekanisme kueri berbasis indeks mendukung berbagai kueri dan cocok untuk sebagian besar aplikasi. Namun, mekanisme ini tidak mendukung beberapa jenis kueri yang umum digunakan dalam teknologi database lainnya: khususnya, join dan kueri agregat tidak didukung dalam mesin kueri Datastore. Lihat halaman Kueri Datastore untuk mengetahui batasan kueri Datastore.
Pengantar
Aplikasi membuat objek kueri untuk jenis entity tertentu dengan memanggil konstruktor Query
secara langsung
class Song(db.Model): title = db.StringProperty() composer = db.StringProperty() date = db.DateTimeProperty() q = db.Query(Song)
atau metode class
all()
dari class model jenis:
q = Song.all()
Tanpa modifikasi lebih lanjut, instance calss Query
yang dihasilkan akan mengambil semua entity yang ada dari jenis yang ditentukan.
Panggilan metode pada objek kemudian dapat digunakan untuk menyesuaikan kueri dengan kriteria filter tambahan, kondisi ancestor, dan tata urutan:
q.filter('title =', 'Imagine') q.ancestor(ancestor_key) q.order('-date')
Demi kemudahan, semua metode ini menampilkan objek kueri itu sendiri sehingga dapat digunakan berturut-turut dalam satu pernyataan:
q.filter('title =', 'Imagine').ancestor(key).order('-date')
Selanjutnya, aplikasi dapat mengeksekusi kueri dan mengakses hasilnya dengan salah satu cara berikut:
-
Memperlakukan objek kueri sebagai iterable, untuk memproses entity yang cocok satu per satu:
for song in q: print song.title
Hal ini secara implisit memanggil metode
run()
dari kueri untuk menghasilkan entity yang cocok. Dengan demikian sama denganfor song in q.run(): print song.title
Anda dapat menetapkan batas jumlah hasil yang akan diproses dengan argumen kata kunci
limit
:for song in q.run(limit=5): print song.title
Antarmuka iterator tidak menyimpan hasil dalam cache, sehingga membuat iterator baru dari objek kueri akan mengulangi kueri yang sama dari awal.
-
Panggil metode
get()
kueri untuk mendapatkan satu entity cocok pertama yang ditemukan di Datastore:song = q.get() print song.title
-
Panggil metode
fetch()
dari kueri untuk mendapatkan daftar semua entity yang cocok hingga jumlah hasil yang ditentukan:results = q.fetch(limit=5) for song in results: print song.title
Seperti halnya
run()
, objek kueri tidak meng-cache hasil, jadi memanggilfetch()
untuk kedua kalinya akan mengeluarkan kembali kueri yang sama.Catatan: Anda seharusnya jarang menggunakan metode ini; sering kali lebih baik untuk menggunakan
run()
.
Konstruktor
Konstruktor untuk Query
class ditentukan sebagai berikut:
- class Query (model_class=None, keys_only=False, cursor=None, namespace=None, projection=None, distinct=False)
-
Membuat instance
Query
class untuk mengambil entity dari App Engine Datastore.Tanpa modifikasi lebih lanjut, objek kueri yang dihasilkan akan mengambil semua entity yang ada dari jenis yang ditentukan oleh
model_class
. Metode instancefilter()
,ancestor(),
, danorder()
kemudian dapat digunakan untuk menyesuaikan kueri dengan kriteria filter tambahan, kondisi ancestor, serta tata urutan.Argumen
- model_class
- Class model (atau Expando) mewakili jenis entity tempat kueri diterapkan.
- keys_only
- Jika
true
, maka hanya akan menampilkan kunci, bukan entity lengkap. Kueri khusus kunci lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap. - cursor
- Posisi kursor untuk melanjutkan kueri.
- namespace
- Namespace yang akan digunakan untuk kueri.
- projection
- Daftar atau tuple nama properti yang akan ditampilkan. Hanya entity dengan properti yang ditentukan yang akan ditampilkan. Jika tidak ditentukan, seluruh entity akan ditampilkan secara default.
Kueri proyeksi lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap.
Catatan: Menentukan parameter ini dapat mengubah persyaratan indeks kueri.
- distinct
- Pada kasus Kueri proyeksi, distinct=True menentukan bahwa hanya hasil yang benar-benar unik yang akan ditampilkan dalam set hasil. Ini hanya akan menampilkan hasil pertama untuk entity yang memiliki nilai yang sama untuk properti yang sedang diproyeksikan.
- True
- Hanya menampilkan hasil pertama untuk setiap set nilai yang berbeda untuk properti dalam proyeksi.
- False
- Semua hasil ditampilkan.
Metode Instance
Instance Query
class memiliki metode berikut:
- filter (property_operator, value)
-
Menambahkan filter properti ke kueri. Kueri hanya akan menampilkan entitas yang propertinya memenuhi semua filternya.
Argumen
- property_operator
- String yang terdiri dari nama properti dan operator perbandingan opsional (
=
,!=
,<
,<=
,>
,>=
,IN
), dipisahkan dengan spasi: misalnya,'age
>'
. Jika hanya nama properti yang ditentukan tanpa operator perbandingan, filter akan secara default membandingkan menggunakan operator sama dengan (=
). - value
- Nilai untuk dibandingkan dengan nilai properti. Contoh:
q.filter('height >', 42).filter('city =', 'Seattle') q.filter('user =', users.get_current_user())
Nilai perbandingan yang ditentukan harus memiliki jenis nilai yang sama dengan properti yang dibandingkan.
- ancestor (ancestor)
-
Menambahkan filter ancestor ke kueri. Kueri hanya akan menampilkan entitas dengan ancestor yang telah ditentukan.
Argumen
- ancestor
- Kunci atau entity ancestor.
- order (properti)
-
Menambahkan tata urutan ke kueri. Jika ada lebih dari satu tata urutan yang ditambahkan, tata urutan tersebut akan diterapkan sesuai dengan urutan penentuan tata urutan tersebut.
Argumen
- properti
- String yang memberikan nama properti yang akan diurutkan, secara opsional
diawali dengan tanda hubung (
-
) untuk menentukan urutan menurun. Menghapus tanda hubung akan menentukan urutan naik secara default. Contoh:# Order alphabetically by last name: q.order('last_name') # Order by height, tallest to shortest: q.order('-height')
- proyeksi ()
-
Menampilkan tuple properti dalam proyeksi atau
None
. - is_keys_only ()
-
Menampilkan nilai boolean yang menunjukkan apakah kueri tersebut adalah kueri khusus kunci.
- run (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, limit=None, batch_size=20, keys_only=False, projection=None, start_cursor=None, end_cursor=None)
-
Menampilkan iterable untuk melakukan loop pada hasil kueri. Ini memungkinkan Anda untuk menentukan operasi kueri dengan setelan parameter dan mengakses hasilnya secara iteratif:
- Mengambil dan menghapus jumlah hasil yang ditentukan oleh argumen
offset
. - Mengambil dan menampilkan hingga jumlah hasil maksimum yang ditentukan oleh argumen
limit
.
Dengan demikian, performa loop akan diskalakan secara linear dengan jumlah
offset
+limit
. Jika mengetahui jumlah hasil yang ingin diambil, Anda harus selalu menetapkan nilailimit
yang eksplisit.Metode ini menggunakan pengambilan data asinkron untuk meningkatkan performa. Secara default, ID ini mengambil hasilnya dari Datastore dalam batch kecil, sehingga memungkinkan aplikasi menghentikan iterasi dan menghindari pengambilan hasil lebih dari yang diperlukan.
Tips: Untuk mengambil semua hasil yang tersedia saat angkanya tidak diketahui, tetapkan
batch_size
ke nilai yang besar, seperti1000
.Tips: Jika tidak perlu mengubah nilai argumen default, Anda dapat menggunakan objek kueri secara langsung sebagai iterable untuk mengontrol loop. Ini secara implisit memanggil
run()
dengan argumen default.Argumen
- read_policy
- Baca kebijakan yang menentukan tingkat konsistensi data yang diinginkan:
- STRONG_CONSISTENCY
- Menjamin hasil terbaru, tetapi terbatas pada satu entity group.
- EVENTUAL_CONSISTENCY
- Dapat mencakup beberapa entity group, tetapi terkadang dapat menampilkan hasil yang usang. Secara umum, kueri dengan konsistensi tertunda berjalan lebih cepat daripada kueri dengan konsistensi kuat, tetapi hal ini tidak selalu berlaku.
Catatan: Kueri global (non-ancestor) mengabaikan argumen ini.
- deadline
- Waktu maksimum, dalam detik, untuk menunggu Datastore menampilkan hasil sebelum membatalkan dengan error. Menerima nilai berupa bilangan bulat atau floating point. Tidak dapat ditetapkan lebih tinggi dari nilai default (60 detik), tetapi dapat disesuaikan dengan mengurangi nilainya untuk memastikan operasi tertentu gagal dengan cepat (misalnya, untuk memberikan respons yang lebih cepat kepada pengguna, mencoba kembali operasi tersebut, mencoba operasi yang berbeda, atau menambahkan operasi ke task queue).
- offset
- Jumlah hasil yang harus dilewati sebelum menampilkan hasil pertama.
- limit
- Jumlah hasil maksimum yang akan ditampilkan.
Jika dihilangkan atau ditetapkan ke
None
, semua hasil yang tersedia akan diambil secara default. - batch_size
- Jumlah hasil yang dicoba diambil per batch. Jika
limit
ditetapkan, maka secara default akan mengikuti batas yang telah ditentukan; jika tidak, maka secara default adalah20
. - keys_only
- Jika
true
, maka hanya akan menampilkan kunci, bukan entity lengkap. Kueri khusus kunci lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap. - projection
- Daftar atau tuple nama properti yang akan ditampilkan. Hanya entity dengan properti yang ditentukan yang akan ditampilkan. Jika tidak ditentukan, seluruh entity akan ditampilkan secara default.
Kueri proyeksi lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap.
Catatan: Menentukan parameter ini dapat mengubah persyaratan indeks kueri.
- start_cursor
- Posisi kursor untuk memulai kueri.
- end_cursor
- Posisi kursor untuk mengakhiri kueri.
- Mengambil dan menghapus jumlah hasil yang ditentukan oleh argumen
- get (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, keys_only=False, projection=None, start_cursor=None, end_cursor=None)
-
Menjalankan kueri dan menampilkan hasil pertama, atau
None
jika tidak ada hasil yang ditemukan.Argumen
- read_policy
- Baca kebijakan yang menentukan tingkat konsistensi data yang diinginkan:
- STRONG_CONSISTENCY
- Menjamin hasil terbaru, tetapi terbatas pada satu entity group.
- EVENTUAL_CONSISTENCY
- Dapat mencakup beberapa entity group, tetapi terkadang dapat menampilkan hasil yang usang. Secara umum, kueri dengan konsistensi tertunda berjalan lebih cepat daripada kueri dengan konsistensi kuat, tetapi hal ini tidak selalu berlaku.
Catatan: Kueri global (non-ancestor) mengabaikan argumen ini.
- deadline
- Waktu maksimum, dalam detik, untuk menunggu Datastore menampilkan hasil sebelum membatalkan dengan error. Menerima nilai berupa bilangan bulat atau floating point. Tidak dapat ditetapkan lebih tinggi dari nilai default (60 detik), tetapi dapat disesuaikan dengan mengurangi nilainya untuk memastikan operasi tertentu gagal dengan cepat (misalnya, untuk memberikan respons yang lebih cepat kepada pengguna, mencoba kembali operasi tersebut, mencoba operasi yang berbeda, atau menambahkan operasi ke task queue).
- offset
- Jumlah hasil yang harus dilewati sebelum menampilkan hasil pertama.
- keys_only
- Jika
true
, maka hanya akan menampilkan kunci, bukan entity lengkap. Kueri khusus kunci lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap. - projection
- Daftar atau tuple nama properti yang akan ditampilkan. Hanya entity dengan properti yang ditentukan yang akan ditampilkan. Jika tidak ditentukan, seluruh entity akan ditampilkan secara default.
Kueri proyeksi lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap.
Catatan: Menentukan parameter ini dapat mengubah persyaratan indeks kueri.
- start_cursor
- Posisi kursor untuk memulai kueri.
- end_cursor
- Posisi kursor untuk mengakhiri kueri.
- fetch (limit, read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, keys_only=False, projection=None, start_cursor=None, end_cursor=None)
-
Menjalankan kueri dan menampilkan daftar hasil (yang mungkin kosong):
- Mengambil dan menghapus jumlah hasil yang ditentukan oleh argumen
offset
. - Mengambil dan menampilkan hingga jumlah hasil maksimum yang ditentukan oleh argumen
limit
.
Dengan demikian, performa metode akan diskalakan secara linear dengan jumlah
offset
+limit
.Catatan: Metode ini hanya berupa wrapper tipis di sekitar metode
run()
, dan kurang efisien serta lebih intensif memori dibandingkan dengan menggunakanrun()
secara langsung. Seharusnya Anda tidak perlu terlalu sering menggunakanfetch()
; metode ini disediakan utamanya untuk memudahkan Anda ketika perlu mengambil daftar lengkap hasil kueri dalam memori.Tips: Metode
fetch()
dirancang untuk hanya mengambil jumlah hasil yang ditentukan oleh argumenlimit
. Untuk mengambil semua hasil kueri yang tersedia saat jumlahnya tidak diketahui, gunakanrun()
dengan ukuran batch yang besar, sepertirun(batch_size=1000)
, bukanfetch()
.Argumen
- limit
- Jumlah hasil maksimum yang akan ditampilkan.
Jika ditetapkan ke
None
, semua hasil yang tersedia akan diambil. - read_policy
- Baca kebijakan yang menentukan tingkat konsistensi data yang diinginkan:
- STRONG_CONSISTENCY
- Menjamin hasil terbaru, tetapi terbatas pada satu entity group.
- EVENTUAL_CONSISTENCY
- Dapat mencakup beberapa entity group, tetapi terkadang dapat menampilkan hasil yang usang. Secara umum, kueri dengan konsistensi tertunda berjalan lebih cepat daripada kueri dengan konsistensi kuat, tetapi hal ini tidak selalu berlaku.
Catatan: Kueri global (non-ancestor) mengabaikan argumen ini.
- deadline
- Waktu maksimum, dalam detik, untuk menunggu Datastore menampilkan hasil sebelum membatalkan dengan error. Menerima nilai berupa bilangan bulat atau floating point. Tidak dapat ditetapkan lebih tinggi dari nilai default (60 detik), tetapi dapat disesuaikan dengan mengurangi nilainya untuk memastikan operasi tertentu gagal dengan cepat (misalnya, untuk memberikan respons yang lebih cepat kepada pengguna, mencoba kembali operasi tersebut, mencoba operasi yang berbeda, atau menambahkan operasi ke task queue).
- offset
- Jumlah hasil yang harus dilewati sebelum menampilkan hasil pertama.
- keys_only
- Jika
true
, maka hanya akan menampilkan kunci, bukan entity lengkap. Kueri khusus kunci lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap. - projection
- Daftar atau tuple nama properti yang akan ditampilkan. Hanya entity dengan properti yang ditentukan yang akan ditampilkan. Jika tidak ditentukan, seluruh entity akan ditampilkan secara default.
Kueri proyeksi lebih cepat dan lebih murah daripada kueri yang menampilkan entity lengkap.
Catatan: Menentukan parameter ini dapat mengubah persyaratan indeks kueri.
- start_cursor
- Posisi kursor untuk memulai kueri.
- end_cursor
- Posisi kursor untuk mengakhiri kueri.
- Mengambil dan menghapus jumlah hasil yang ditentukan oleh argumen
- count (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, limit=1000, start_cursor=None, end_cursor=None)
-
Menampilkan jumlah hasil yang cocok dengan kueri. Proses ini lebih cepat dengan faktor konstan dibandingan dengan mengambil semua hasil, tetapi waktu berjalan masih diskalakan secara linear seiring dengan penambahan
offset
+limit
. Kecuali jika jumlah hasilnya diperkirakan kecil, sebaiknya tentukan argumenlimit
; jika tidak, metode tersebut akan berlanjut sampai selesai menghitung atau waktu habis.Argumen
- read_policy
- Baca kebijakan yang menentukan tingkat konsistensi data yang diinginkan:
- STRONG_CONSISTENCY
- Menjamin hasil terbaru, tetapi terbatas pada satu entity group.
- EVENTUAL_CONSISTENCY
- Dapat mencakup beberapa entity group, tetapi terkadang dapat menampilkan hasil yang usang. Secara umum, kueri dengan konsistensi tertunda berjalan lebih cepat daripada kueri dengan konsistensi kuat, tetapi hal ini tidak selalu berlaku.
Catatan: Kueri global (non-ancestor) mengabaikan argumen ini.
- deadline
- Waktu maksimum, dalam detik, untuk menunggu Datastore menampilkan hasil sebelum membatalkan dengan error. Menerima nilai berupa bilangan bulat atau floating point. Tidak dapat ditetapkan lebih tinggi dari nilai default (60 detik), tetapi dapat disesuaikan dengan mengurangi nilainya untuk memastikan operasi tertentu gagal dengan cepat (misalnya, untuk memberikan respons yang lebih cepat kepada pengguna, mencoba kembali operasi tersebut, mencoba operasi yang berbeda, atau menambahkan operasi ke task queue).
- offset
- Jumlah hasil yang perlu dilewati sebelum menghitung hasil pertama.
- limit
- Jumlah hasil maksimum yang akan dihitung.
- start_cursor
- Posisi kursor untuk memulai kueri.
- end_cursor
- Posisi kursor untuk mengakhiri kueri.
- index_list ()
-
Menampilkan daftar indeks yang digunakan oleh kueri yang dieksekusi, termasuk indeks properti utama, komposit, jenis, dan properti tunggal.
Perhatian: Memanggil metode ini pada kueri yang belum dieksekusi akan memunculkan pengecualian
AssertionError
.Catatan: Fitur ini tidak sepenuhnya didukung pada server pengembangan. Saat digunakan dengan server pengembangan, hasilnya adalah daftar kosong atau daftar yang berisi hanya satu indeks komposit.
Misalnya, kode berikut mencetak berbagai informasi tentang indeks yang digunakan oleh kueri:
# other imports ... import webapp2 from google.appengine.api import users from google.appengine.ext import db class Greeting(db.Model): author = db.StringProperty() content = db.StringProperty(multiline=True) date = db.DateTimeProperty(auto_now_add=True) class MainPage(webapp2.RequestHandler): def get(self): user = users.get_current_user() q = db.Query(Greeting) q.filter("author =", user.user_id()) q.order("-date") q.fetch(100) index_list = q.index_list() for ix in index_list: self.response.out.write("Kind: %s" % ix.kind()) self.response.out.write("<br />") self.response.out.write("Has ancestor? %s" % ix.has_ancestor()) self.response.out.write("<br />") for name, direction in ix.properties(): self.response.out.write("Property name: "+name) self.response.out.write("<br />") if direction == db.Index.DESCENDING: self.response.out.write("Sort direction: DESCENDING") else: self.response.out.write("Sort direction: ASCENDING") self.response.out.write("<br />")
Tindakan ini menghasilkan output seperti berikut untuk setiap indeks:
Kind: Greeting Has ancestor? False Property name: author Sort direction: ASCENDING Property name: date Sort direction: DESCENDING
- kursor ()
-
Menampilkan string kursor dalam format Base64 yang menunjukkan posisi dalam set hasil kueri setelah hasil terakhir yang diambil. String kursor aman digunakan dalam parameter HTTP
GET
danPOST
, serta dapat disimpan di Datastore atau Memcache. Pemanggilan kueri yang sama di masa mendatang dapat memberikan string ini melalui parameterstart_cursor
atau metodewith_cursor()
untuk melanjutkan pengambilan hasil dari posisi ini.Perhatian: Memanggil metode ini pada kueri yang belum dieksekusi akan memunculkan pengecualian
AssertionError
.Catatan: Tidak semua kueri kompatibel dengan kursor; lihat halaman Datastore Queries untuk mengetahui informasi selengkapnya.
- with_cursor (start_cursor, end_cursor=None)
-
Menentukan posisi akhir (opsional) dan awal dalam set hasil kueri yang digunakan untuk mengambil hasil. String kursor yang menunjukkan posisi awal dan akhir dapat diperoleh dengan memanggil
cursor()
setelah pemanggilan kueri sebelumnya. Kueri saat ini harus sama dengan pemanggilan sebelumnya, termasuk jenis entity, filter properti, filter ancestor, dan tata urutan.Argumen
- start_cursor
- String kursor dalam format Base64 yang menentukan tempat untuk memulai kueri.
- end_cursor
- String kursor dalam format Base64 yang menentukan tempat untuk mengakhiri kueri.