NDB 查詢類別

Query 物件代表 NDB 查詢,這是針對經過篩選及排序的實體清單提出的要求。

本頁為參考說明文件。如要一般討論 NDB 查詢,請參閱「查詢」。

查詢選項

許多查詢方法會採用一組標準的額外選項,形式可以是關鍵字引數 (例如 keys_only=True),也可以是透過 options=QueryOptions(...) 傳遞的 QueryOptions 物件。

查詢支援多種設定選項。 這些引數是透過 Query 方法的關鍵字引數指定:

引數 類型 預設值說明
keys_onlybool False 所有作業都會傳回鍵,而非實體。
projection屬性 (或字串) 的組合 (或清單)None 作業只會傳回已設定指定屬性的實體。 projection=[Article.title, Article.date]projection=['title', 'date'] 擷取只設定這兩個欄位的實體。 (請參閱「預測查詢」)。
offset int 0 要略過的查詢結果數。
limit int 不限要傳回的查詢結果數上限。
batch_size int 20 批次大小。

只會影響查詢效率;批次大小越大,使用的記憶體就越多,但 RPC 呼叫次數會減少。
prefetch_sizeint None 覆寫傳回的第一批資料的批次大小。
produce_cursors bool False 從查詢生成游標 (請參閱「查詢疊代器」)。查詢游標)。
start_cursorCursor None 搜尋的起點 (請參閱「查詢游標」)。
end_cursorCursor None 搜尋的終點 (請參閱「查詢游標」)。
deadlineint 取決於 Context 覆寫遠端程序呼叫 (RPC) 期限 (如果 Context 建立時未經過覆寫,則預設值為 5 秒)
read_policyndb.EVENTUAL_CONSISTENCY 讀取政策。設為 ndb.EVENTUAL_CONSISTENCY 即有可能更快取得結果,而不必等候 Datastore 對所有傳回的記錄套用待處理的變更。

若要使用一組特定選項執行查詢,請將關鍵字引數傳送至適用的方法:

qry = Employee.query().filter(...).order(...) # Create a query
for acct in qry.fetch(10, offset=20): # Skip the first 20
  print acct

您有時候可能想要保存一組查詢選項,以便在不同的地方派上用場。雖然您可以將這些項目保留在字典中,並使用 **kwds 將這個字典傳遞至方法,但您也可以建立 QueryOptions 物件,並使用選項關鍵字引數傳遞該物件。以下兩個範例的作用相同:

qo = ndb.QueryOptions(keys_only=True, offset=20)
results = qry.fetch(10, options=qo)
results = qry.fetch(10, keys_only=True, offset=20)

建構函式

應用程式通常會透過呼叫 Model.query() 建立 Query。但也可以呼叫 ndb.Query()

引數

kind
選用種類字串。通常是實體類別的名稱。
ancestor
選用祖先鍵。
filters
代表篩選運算式樹狀結構的選用節點。
orders
選用 datastore_query.Order 物件。
應用程式
選用應用程式 ID。
命名空間
選用命名空間。如未指定,系統會使用執行查詢時的預設命名空間。
projection
要投影的屬性清單或元組 (選用)。
group_by
(選用) 要分組的屬性清單或元組。
default_options
選用QueryOptions物件,提供執行查詢時可用的預設查詢選項。

實例方法

filter(filter1, filter2, ...)
傳回套用額外篩選器的新 Query。 採用查詢中所述的篩選器引數。qry.filter(filter1).filter(filter2) 相當於 qry.filter(filter1filter2)
get(**q_options)
傳回第一個查詢結果 (如有),否則傳回 None。這與呼叫 q.fetch(1) 並傳回結果清單的第一個項目類似。

引數

**q_options
支援所有查詢選項關鍵字引數
order(order1, order2, ...)
傳回套用額外排序順序的新 Query。 採用一或多個引數,這些引數是屬性或「否定」屬性。 舉例來說,如要依年齡排序使用者,並依名稱「打破平手」局面,您可能會使用類似 qry.order(-Account.birthday, Account.name) 的項目:
bind(...values...)
這個函式適用於使用參數繫結 (:1:2 等) 或具名繫結 (:foo:bar 等) 的 GQL 查詢。並將傳遞的值繫結至參數。

如要繫結參數,可以呼叫類似下列項目的項目: qry.bind("USA", 49)。 如要繫結具名參數,可以呼叫類似 qry.bind(region = "USA", threshold = 49) 的項目。

傳回繫結參數值的新 Query 物件。

count(limit=None, **q_options)
傳回查詢結果數量,設有數量上限。這會傳回與 len(q.fetch(limit)) 相同的結果,但效率更高。

引數

limit
最多要計算多少結果
**q_options
支援所有查詢選項關鍵字引數內容選項
count_async(limit, **q_options)
非同步計算查詢結果數量,設有數量上限,可傳回結果為數字的 Future。這是 count() 的非同步版本。
fetch(limit, **q_options)
擷取查詢結果清單,最多可達上限。

引數

limit
最多要計算多少結果
**q_options
支援所有查詢選項關鍵字引數
fetch_async(limit, **q_options)
非同步擷取查詢結果清單,設有數量上限。傳回 Future,其結果為結果清單。這是非同步版的 fetch()
fetch_page(page_size, **q_options)
擷取「頁面」的結果。這是專為分頁使用者介面設計的方法。

引數

page_size
最多會傳回這麼多結果。
**q_options
支援所有查詢選項關鍵字引數
傳回元組 (results, cursor, more)
  • results:查詢結果清單
  • cursor:指向「下一批」結果的查詢游標。如果沒有其他結果,這可能是 None
  • more bool 代表這批結果之後是否 (可能) 還有其他結果。如為 False,則代表已無任何結果。如為 True,則代表「可能」還有更多結果。

如要擷取下一頁,請使用 start_cursor=cursor 將呼叫傳回的游標傳送至下一項呼叫。常見的慣用語是使用 cursor.urlsafe() 將游標傳送至用戶端,並使用 Cursor(urlsafe=string) 在後續要求中重建該游標。

fetch_page_async(page_size, **q_options)
非同步擷取「網頁」結果。這是 fetch_page() 的非同步版本。
get_async(**q_options)
非同步傳回第一個查詢結果 (如有),否則傳回 None。這是非同步版的 get()
iter(**q_options)
建構並傳回查詢的疊代器。

引數

**q_options
支援所有查詢選項關鍵字引數

傳回 QueryIterator 物件。

map(callback, pass_batch_into_callback=None, merge_future=None, **q_options)
將回呼函式或 Tasklet 對應至查詢結果。也就是說,將函式 (或 Tasklet) 套用至查詢結果中的每個實體。

引數

callback
要套用至每個結果的函式或工作小程式。
pass_batch_into_callback
如果 True,則會使用批次資訊引數呼叫回呼,如下所述。
merge_future
選用的 Future 子類別,請見下文。
**q_options
支援所有查詢選項關鍵字引數

「回呼簽名」:通常會使用實體作為引數來呼叫回呼函式。不過,如果系統可取得 keys_only=True,則會使用 Key 來進行呼叫。如果提供 pass_batch_into_callback=True,系統會使用三個引數呼叫回呼函式:目前的批次、批次內的索引,以及該索引處的實體或 Key。回呼可以傳回任何內容。如果回呼函式為 None,則會將其假定為僅須傳回已傳入實體或金鑰的簡易回呼函式。

選用 merge_future merge_future 是進階引數,可用於覆寫回呼結果合併為整體 map() 傳回值的方式。根據預設,這個函式會產生一個回呼傳回值的清單。您可以替換其中一小部分的專屬替代方法,藉此以其他方式排列清單。請參閱 tasklets.MultiFuture 的原始碼,瞭解預設實作方式,以及 merge_future 物件必須實作的通訊協定說明。同一模組的替代方案包括 QueueFutureSerialQueueFutureReducingFuture

傳回所有回呼的結果清單。 (但請參閱上方的「選用 merge_future」)。查詢執行完畢且所有回呼都已傳回時,就會傳回這個值。

map_async(callback, pass_batch_into_callback=None, merge_future=None, **q_options)
以非同步方式將回呼函式或 Tasklet 對應至查詢結果。這是非同步版的 map()