Python 2.7 telah mencapai akhir dukungan
dan akan dihentikan penggunaannya
pada 31 Januari 2026. Setelah penghentian penggunaan, Anda tidak akan dapat men-deploy aplikasi Python 2.7, meskipun organisasi Anda sebelumnya menggunakan kebijakan organisasi untuk mengaktifkan kembali deployment runtime lama. Aplikasi Python 2.7 yang ada akan terus berjalan dan menerima traffic setelah
tanggal penghentiannya. Sebaiknya Anda bermigrasi ke versi Python terbaru yang didukung.
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Objek Query mewakili kueri NDB, yaitu permintaan untuk daftar entity yang difilter dan diurutkan.
Halaman ini berisi dokumentasi referensi. Untuk pembahasan umum tentang kueri NDB, lihat Kueri.
Opsi Kueri
Banyak metode kueri menggunakan sekumpulan standar opsi
tambahan, baik dalam bentuk argumen kata kunci seperti
keys_only=True, maupun sebagai
objek QueryOptions yang diteruskan dengan
options=QueryOptions(...).
Kueri mendukung berbagai opsi konfigurasi.
Properti ini ditentukan berdasarkan argumen kata kunci ke metode Query:
Argumen
Jenis
Default
Deskripsi
keys_only
bool
False
Semua operasi menampilkan kunci, bukan entity.
projection
tuple (atau daftar) properti (atau string)
None
Operasi menampilkan entity yang hanya berisi set properti yang
ditentukan.
projection=[Article.title, Article.date]
atau projection=['title', 'date']
mengambil entity dengan hanya dua kolom yang ditetapkan.
(Lihat Kueri Proyeksi.)
offset
int
0
Jumlah hasil kueri yang akan dilewati.
batas
int
Tak terbatas
Jumlah hasil kueri maksimum yang akan ditampilkan.
batch_size
int
20
Ukuran tumpukan.
Hanya memengaruhi efisiensi kueri; ukuran tumpukan yang lebih besar menggunakan lebih banyak memori tetapi membuat panggilan RPC lebih sedikit.
prefetch_size
int
None
Mengganti ukuran tumpukan untuk batch pertama yang ditampilkan.
Titik awal untuk penelusuran (lihat Query Cursor).
end_cursor
Cursor
None
Titik akhir untuk penelusuran (lihat Query Cursor).
deadline
int
Bergantung pada Context
Mengganti batas waktu RPC (yang defaultnya adalah 5 detik jika tidak diganti saat
Context dibuat)
read_policy
ndb.EVENTUAL_CONSISTENCY
Kebijakan baca. Setel ke ndb.EVENTUAL_CONSISTENCY untuk mendapatkan hasil yang mungkin lebih cepat tanpa menunggu Datastore menerapkan perubahan dalam proses pada semua data yang ditampilkan.
Untuk menjalankan kueri dengan kumpulan opsi tertentu, teruskan argumen kata kunci ke metode yang berlaku:
qry=Employee.query().filter(...).order(...)# Create a queryforacctinqry.fetch(10,offset=20):# Skip the first 20printacct
Terkadang, Anda mungkin ingin menyimpan serangkaian opsi kueri
dan menggunakannya di berbagai tempat. Meskipun Anda dapat menyimpannya dalam kamus dan meneruskan kamus ini ke metode menggunakan **kwds, Anda juga dapat membuat objek QueryOptions dan meneruskannya menggunakan opsi argumen kata kunci.
Dua contoh berikut adalah contoh yang setara:
Biasanya, aplikasi membuat Query dengan memanggil
Model.query(). Namun, Anda juga dapat memanggil ndb.Query().
Argumen
jenis
String jenis opsional. Biasanya, nama class entity.
ancestor
Kunci ancestor opsional.
filter
Node opsional yang mewakili hierarki ekspresi filter.
pesanan
Opsional datastore_query.Order objek.
aplikasi
ID aplikasi opsional.
namespace
Namespace opsional. Jika tidak ditentukan, namespace default pada saat kueri dieksekusi akan digunakan.
projection
Daftar atau tuple properti opsional yang akan di-project.
group_by
Daftar atau tuple properti opsional yang akan dikelompokkan.
default_options
Objek
QueryOptions opsional
yang memberikan opsi kueri default untuk digunakan saat kueri dieksekusi.
Metode Instance
filter(filter1, filter2, ...)
Menampilkan Query baru dengan filter tambahan.
Mengambil argumen filter seperti yang dijelaskan dalam Kueri.
qry.filter(filter1).filter(filter2)
setara dengan
qry.filter(filter1, filter2)
mendapatkan(**q_options)
Menampilkan hasil kueri pertama, jika ada (jika tidak, None).
Hal ini mirip dengan memanggil q.fetch(1) dan menampilkan
item pertama dari daftar hasil.
Menampilkan Query baru dengan tata urutan tambahan yang diterapkan.
Dibutuhkan satu atau beberapa argumen yang merupakan properti atau properti yang "diabaikan".
Misalnya, untuk mengurutkan pengguna menurut usia dan "putus hubungan" menurut nama, Anda dapat
menggunakan sesuatu seperti qry.order(-Account.birthday, Account.name)
ikat(...values...)
Fungsi ini digunakan untuk kueri GQL yang menggunakan binding parameter (:1, :2, dll.) atau binding bernama (:foo, :bar, dll.). Fungsi ini mengikat nilai yang diteruskan ke parameter.
Untuk mengikat parameter, Anda dapat memanggil sesuatu seperti
qry.bind("USA", 49).
Untuk mengikat parameter bernama, Anda dapat memanggil sesuatu seperti qry.bind(region = "USA", threshold = 49).
Menampilkan objek Query baru dengan nilai parameter yang terikat.
jumlah(batas=None, **q_options)
Menampilkan jumlah hasil kueri, hingga batas.
Tindakan ini akan menampilkan hasil yang sama seperti len(q.fetch(limit)), tetapi lebih
efisien.
Secara asinkron menghitung jumlah hasil kueri, hingga batas tertentu; fungsi ini menampilkan Future yang hasilnya berupa angka.
Ini adalah versi asinkron dari count().
pengambilan(batas, **q_options)
Mengambil daftar hasil kueri, hingga batas tertentu.
Mengambil daftar hasil kueri secara asinkron, hingga batas tertentu.
Menampilkan Future yang hasilnya adalah daftar hasil.
Ini adalah versi asinkron dari fetch().
fetch_page(page_size, **q_options)
Mengambil "halaman" hasil. Metode ini adalah metode khusus untuk digunakan antarmuka pengguna paging.
cursorquery cursor yang menunjuk
ke batch hasil "berikutnya". Jika tidak ada hasil lagi, mungkin None.
morebool yang menunjukkan apakah akan ada (kemungkinan) lebih banyak hasil setelah batch ini.
Jika False, tidak ada hasil lagi;
jika True, mungkin ada hasil lainnya.
Untuk mengambil halaman berikutnya, teruskan kursor yang ditampilkan oleh satu panggilan ke panggilan berikutnya menggunakan start_cursor=cursor.
Idiom yang umum adalah meneruskan kursor ke
klien menggunakan cursor.urlsafe()
dan merekonstruksi kursor tersebut dalam permintaan berikutnya menggunakan
Cursor(urlsafe=string).
fetch_page_async(page_size, **q_options)
Mengambil "halaman" hasil secara asinkron. Ini adalah versi asinkron
fetch_page().
get_async(**q_options)
Secara asinkron menampilkan hasil kueri pertama, jika ada
(jika tidak, None). Ini adalah versi asinkron
get().
Tanda tangan callback Callback biasanya dipanggil dengan entitas
sebagai argumen. Namun, jika
keys_only=True diberikan, akan dipanggil
dengan Kunci.
Jika pass_batch_into_callback=True diberikan, callback
akan dipanggil dengan tiga argumen: batch saat ini, indeks dalam
batch, dan entity atau Key pada indeks tersebut.
Callback dapat
menampilkan apa pun yang diinginkannya. Jika callback-nya adalah None, callback biasa akan diasumsikan bahwa hanya menampilkan entity atau kunci yang diteruskan.
Opsional merge_futuremerge_future adalah argumen lanjutan yang dapat digunakan untuk mengganti cara hasil callback digabungkan ke dalam keseluruhan map() nilai yang ditampilkan. Secara default, daftar
nilai yang ditampilkan callback akan dibuat. Dengan mengganti salah satu dari sejumlah kecil alternatif khusus, Anda dapat mengatur sebaliknya. Lihat kode sumber untuk
tasklets.MultiFuture jika ingin mengetahui implementasi
default dan deskripsi
protokol yang harus diimplementasikan objek
merge_future. Alternatif dari modul yang sama
mencakup QueueFuture, SerialQueueFuture,
dan ReducingFuture.
Menampilkan daftar hasil semua callback.
(Namun, lihat 'merge_future opsional' di atas.) Metode ini ditampilkan ketika kueri telah berjalan hingga selesai dan semua callback telah ditampilkan.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Sulit dipahami","hardToUnderstand","thumb-down"],["Informasi atau kode contoh salah","incorrectInformationOrSampleCode","thumb-down"],["Informasi/contoh yang saya butuhkan tidak ada","missingTheInformationSamplesINeed","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-09-04 UTC."],[[["\u003cp\u003eThis documentation covers how to use NDB queries within the legacy App Engine standard environment's first-generation runtimes, noting that for App Engine Python 3, a migration guide is recommended.\u003c/p\u003e\n"],["\u003cp\u003eAn NDB \u003ccode\u003eQuery\u003c/code\u003e object is used to request a filtered and sorted list of entities, and you can create one using the \u003ccode\u003e<var>Model</var>.query()\u003c/code\u003e method or directly using \u003ccode\u003endb.Query()\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eQueries can be configured using various keyword arguments or a \u003ccode\u003eQueryOptions\u003c/code\u003e object, allowing for customizations such as returning only keys (\u003ccode\u003ekeys_only\u003c/code\u003e), limiting results (\u003ccode\u003elimit\u003c/code\u003e), skipping results (\u003ccode\u003eoffset\u003c/code\u003e), or specifying a data projection (\u003ccode\u003eprojection\u003c/code\u003e).\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eQuery\u003c/code\u003e object has several instance methods like \u003ccode\u003efilter()\u003c/code\u003e, \u003ccode\u003eorder()\u003c/code\u003e, \u003ccode\u003eget()\u003c/code\u003e, \u003ccode\u003ecount()\u003c/code\u003e, \u003ccode\u003efetch()\u003c/code\u003e, \u003ccode\u003efetch_page()\u003c/code\u003e, \u003ccode\u003emap()\u003c/code\u003e and their async versions, allowing for advanced query customization, execution, and data retrieval.\u003c/p\u003e\n"],["\u003cp\u003eQuery methods often accept keyword arguments, such as \u003ccode\u003elimit\u003c/code\u003e, \u003ccode\u003eoffset\u003c/code\u003e, \u003ccode\u003ekeys_only\u003c/code\u003e, and \u003ccode\u003eprojection\u003c/code\u003e, to refine the results, and these same options can be used in a \u003ccode\u003eQueryOptions\u003c/code\u003e object.\u003c/p\u003e\n"]]],[],null,["# NDB Query Class\n\n| This page describes how to use the legacy bundled services and APIs. This API can only run in first-generation runtimes in the App Engine standard environment. If you are updating to the App Engine Python 3 runtime, refer to the [migration guide](/appengine/migration-center/standard/migrate-to-second-gen/python-differences) to learn about your migration options for legacy bundled services.\n\nA `Query` object represents an NDB query, a request for\na filtered, sorted list of entities.\n\nThis page contains reference documentation. For a general discussion\nof NDB queries, see [Queries](/appengine/docs/legacy/standard/python/ndb/queries).\n\nQuery Options\n-------------\n\nMany query methods take a standard set of additional\noptions, either in the form of keyword arguments such as\n`keys_only=True`, or as\n`QueryOptions` object passed with\n`options=QueryOptions(...)`.\n\nQueries support a variety of configuration options.\nThese are specified by keyword arguments to the `Query` methods:\n\nTo run a query with a specific set of options,\npass the keyword arguments to the applicable method:\n\n```python\nqry = Employee.query().filter(...).order(...) # Create a query\nfor acct in qry.fetch(10, offset=20): # Skip the first 20\n print acct\n```\n\nOccasionally, you might want to keep a set of query options\naround and use them in various places. While you could just\nkeep them in a dictionary and pass this dictionary to the\nmethods using `**kwds`, you can also create a\n`QueryOptions` object and pass\nit using the options keyword argument.\nThe following two examples are equivalent:\n\n```python\nqo = ndb.QueryOptions(keys_only=True, offset=20)\nresults = qry.fetch(10, options=qo)\nresults = qry.fetch(10, keys_only=True, offset=20)\n```\n\nConstructor\n-----------\n\nTypically, an application creates a `Query` by calling\n\u003cvar translate=\"no\"\u003eModel\u003c/var\u003e`.query()`. But it's also possible to call\n`ndb.Query()`.\n\n**Arguments**\n\nkind\n: Optional kind string. Normally, the name of a entity class.\n\nancestor\n: Optional ancestor Key.\n\nfilters\n: Optional Node representing a filter expression tree.\n\norders\n: Optional `datastore_query.Order` object.\n\napp\n: Optional app id.\n\nnamespace\n: Optional namespace. If not specified,\n the default namespace at the time the query is executed will be used.\n\nprojection\n: Optional list or tuple of properties to project.\n\ngroup_by\n: Optional list or tuple of properties to group by.\n\ndefault_options\n: Optional\n [QueryOptions](/appengine/docs/legacy/standard/python/ndb/queryclass#kwdargs_options) object\n giving default query options to be used when the query is executed.\n\nInstance Methods\n----------------\n\nfilter(\u003cvar translate=\"no\"\u003efilter1, filter2, ...\u003c/var\u003e)\n: Returns a new `Query` with additional filter(s) applied.\n Takes filter arguments as described in\n [Queries](/appengine/docs/legacy/standard/python/ndb/queries).\n `qry.filter(`\u003cvar translate=\"no\"\u003efilter1\u003c/var\u003e`).filter(`\u003cvar translate=\"no\"\u003efilter2\u003c/var\u003e`)`\n is equivalent to\n `qry.filter(`\u003cvar translate=\"no\"\u003efilter1\u003c/var\u003e`, `\u003cvar translate=\"no\"\u003efilter2\u003c/var\u003e`)`\n\nget(\\*\\*q_options)\n: Returns the first query result, if any (otherwise `None`).\n This is similar to calling `q.fetch(1)` and returning\n the first item of the list of results.\n\n **Arguments**\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\norder(\u003cvar translate=\"no\"\u003eorder1\u003c/var\u003e, \u003cvar translate=\"no\"\u003eorder2\u003c/var\u003e, ...)\n: Returns a new `Query` with additional sort order(s) applied.\n Takes one or more arguments which are properties or \"negated\" properties.\n For example, to sort users by age and \"break ties\" by name, you might\n use something like `qry.order(-Account.birthday, Account.name)`\n\nbind(\u003cvar translate=\"no\"\u003e...values...\u003c/var\u003e)\n: This function is for use with GQL queries that use parameter\n bindings (`:1`, `:2`, etc.) or named bindings\n (`:foo`, `:bar`, etc.). It binds the passed\n values to the parameters.\n\n To bind parameters, you might call something like\n `qry.bind(\"USA\", 49)`.\n To bind named parameters, you might call something like\n `qry.bind(region = \"USA\", threshold = 49)`.\n\n Returns a new `Query` object with the parameter values bound.\n\ncount(limit=None, \\*\\*q_options)\n: Returns the number of query results, up to a limit.\n This returns the same result as `len(q.fetch(limit))` but more\n efficiently.\n\n **Arguments**\n\n limit\n : How many results to count at most\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n and [context options](/appengine/docs/legacy/standard/python/ndb/functions#context_options)\n are supported.\n\ncount_async(limit, \\*\\*q_options)\n: Asynchronously counts the number of query results, up to a limit;\n it returns a [Future](/appengine/docs/legacy/standard/python/ndb/futureclass)\n whose result is a number.\n This is the asynchronous version of [count()](#Query_count).\n\nfetch(limit, \\*\\*q_options)\n\n: Fetch a list of query results, up to a limit. **Arguments**\n\n limit\n : How many results to count at most\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\nfetch_async(limit, \\*\\*q_options)\n: Asynchronously fetch a list of query results, up to a limit.\n Returns a [Future](/appengine/docs/legacy/standard/python/ndb/futureclass)\n whose result is a list of results.\n This is the asynchronous version of [fetch()](#Query_fetch).\n\nfetch_page(page_size, \\*\\*q_options)\n\n: Fetch a \"page\" of results. This is a specialized method for use by paging user interfaces. **Arguments**\n\n page_size\n : At most this many results will be returned.\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\n Returns a tuple `(`\u003cvar translate=\"no\"\u003eresults\u003c/var\u003e`,\n `\u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e`, `\u003cvar translate=\"no\"\u003emore\u003c/var\u003e`)`:\n\n - \u003cvar translate=\"no\"\u003eresults\u003c/var\u003e list of query results\n - \u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e a [query cursor](/appengine/docs/legacy/standard/python/ndb/queries#cursors) pointing to the \"next\" batch of results. If there are no more results, this might be `None`.\n - \u003cvar translate=\"no\"\u003emore\u003c/var\u003e `bool` indicating whether there are (likely) more results after this batch. If `False`, there are no more results; if `True`, there are *probably* more results.\n\n To fetch the next page,\n pass the cursor returned by one call to the next call using\n `start_cursor=`\u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e.\n A common idiom is to pass the cursor to\n the client using \u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e`.urlsafe()`\n and to reconstruct that cursor on a subsequent request using\n `Cursor(urlsafe=`\u003cvar translate=\"no\"\u003estring\u003c/var\u003e`)`.\n\nfetch_page_async(page_size, \\*\\*q_options)\n: Asynchronously fetch a \"page\" of results. This is the asynchronous version\n of [fetch_page()](#Query_fetch_page).\n\nget_async(\\*\\*q_options)\n: Asynchronously returns the first query result, if any\n (otherwise `None`). This is the asynchronous version\n of [get()](#Query_get).\n\niter(\\*\\*q_options)\n\n: Constructs and returns an iterator over the query. **Arguments**\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\n Returns a [QueryIterator](/appengine/docs/legacy/standard/python/ndb/queries#iterators) object.\n\nmap(callback, pass_batch_into_callback=None, merge_future=None, \\*\\*q_options)\n\n: Map a callback function or tasklet over the query results. That is, apply the function (or tasklet) to each entity in the query results. **Arguments**\n\n callback\n : A function or tasklet to be applied to each result.\n\n pass_batch_into_callback\n : If `True`, calls the callback with batch information\n arguments as described below.\n\n merge_future\n : Optional [Future](/appengine/docs/legacy/standard/python/ndb/futureclass) subclass;\n see below.\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\n *Callback signature* The callback is normally called with an entity\n as argument. However, if\n `keys_only=True` is given, it is called\n with a [Key](/appengine/docs/legacy/standard/python/ndb/keyclass).\n If `pass_batch_into_callback=True` is given, the callback is\n called with three arguments: the current batch, the index within\n the batch, and the entity or `Key` at that index.\n The callback can\n return whatever it wants. If the callback is `None`, a trivial\n callback is assumed that just returns the entity or key passed in.\n\n *Optional `merge_future`* The `merge_future`\n is an advanced argument\n that can be used to override how the callback results are combined\n into the overall `map()` return value. By default, a list of\n callback return values is produced. By substituting one of a\n small number of specialized alternatives you can arrange\n otherwise. See the source code for\n `tasklets.MultiFuture` for the default\n implementation and a description of\n the protocol the `merge_future`\n object must implement. Alternatives from the same\n module include `QueueFuture`, `SerialQueueFuture`\n and `ReducingFuture`.\n\n Returns a list of the results of all the callbacks.\n (But see 'optional `merge_future`' above.) It returns\n when the query has run to completion and all callbacks have returned.\n\nmap_async(callback, pass_batch_into_callback=None, merge_future=None, \\*\\*q_options)\n: Asynchronously map a callback function or tasklet over the query results.\n This is the asynchronous version of [map()](#map)."]]