NDB 函式

函式

ndb.add_flow_exception(exc)
指定應記錄例外狀況,但例外狀況只是正常程式流程的一部分。(通常,引發例外狀況會將警告訊息寫入應用程式的記錄檔。)

引數

exc
不應記錄的例外狀況類別。

預設不記錄以下例外狀況:

  • webob.exc.HTTPException (及其子類別)
  • ndb.Rollback
ndb.delete_multi(keys, **ctx_options)
刪除以傳遞的鍵序列識別的實體。

引數

keys
按鍵順序
**ctx_options
內容選項
ndb.delete_multi_async(keys, **ctx_options)
非同步刪除由傳遞的索引鍵序列識別的實體。

引數

keys
按鍵順序
**ctx_options
內容選項

會傳回 Future 物件的清單。每個 future 的結果都會是 None

ndb.get_multi(keys, **ctx_options)
擷取傳遞的索引鍵序列所識別的實體。

引數

keys
按鍵順序
**ctx_options
內容選項

會傳回清單。若找不到金鑰,每一個清單項目各會是模型執行個體或 None

ndb.get_multi_async(keys, **ctx_options)
非同步擷取以傳遞的鍵序列識別的實體。

引數

keys
按鍵順序
**ctx_options
內容選項

會傳回 Future 物件的清單。若找不到金鑰,future 的每一個結果各會是模型執行個體或 None

ndb.in_transaction()
會傳回布林值,表示交易在當下是否有效。
@ndb.non_transactional
@ndb.non_transactional(allow_existing=True)
裝飾器,可確保函式在交易外部執行。

引數:

allow_existing
如果 True (預設值) 和修飾函式是由交易中的程式碼呼叫,則函式會獨立於交易執行。如果 False,且裝飾函式是由交易中的程式碼呼叫,則會引發例外狀況。
ndb.put_multi(entities, **ctx_options)
儲存一連串的 Model 例項。

引數

實體
模型執行個體序列
**ctx_options
內容選項

傳回儲存的 金鑰清單。

ndb.put_multi_async(entities, **ctx_options)
以非同步方式儲存一連串的 Model 執行個體。

引數

實體
模型執行個體序列
**ctx_options
內容選項

傳回 Future 物件的清單。每個 future 的結果都會是儲存的金鑰

ndb.transaction(callback, **ctx_options)
在交易中執行回呼。

引數

callback
要呼叫的函式或工作小程式
**ctx_options
交易選項

傳回回呼傳回的任何資料。 會引發回呼引發的任何狀況,若交易失敗,則會引發 TransactionFailedError 例外狀況。

若要傳送引數至回呼函式,請使用 lambda。例如:

def my_callback(key, inc):
  ...

transaction(lambda: my_callback(Key(...), 1))
ndb.transaction_async(callback, **ctx_options)
在交易中非同步執行回呼。

引數

callback
要呼叫的函式或工作小程式
**ctx_options
交易選項

傳回 Future。 future 會傳回回呼傳回的任何資料,或者會引發回呼引發的任何狀況,若交易失敗,則會引發 TransactionFailedError

若要傳送引數至回呼函式,請使用 lambda。例如:

def my_callback(key, inc):
  ...

transaction(lambda: my_callback(Key(...), 1))
@ndb.transactional
@ndb.transactional(**ctx_options)
裝飾器,可讓函式自動在交易中執行。

引數:

這個裝飾器可以有交易選項

內容選項與交易選項

內容選項可讓您使用不同的設定,執行特定資料儲存庫作業。例如,您可以變更個別要求的讀取政策或遠端程序呼叫 (RPC) 期限。 如要這麼做,請將內容選項傳遞至幾乎所有作業。 部分交易相關函式會採用交易選項,除了內容選項集之外,還包含其他選項。

以下列舉幾個使用內容選項的範例。若要在讀取實體時將 RPC 期限設為 1 秒,可以使用:

key.get(deadline=1)

若要在寫入實體時將 memcache 逾時設為 30 秒,可以使用:

ent.put(ndb_memcache_timeout=30)

若要刪除已經快取的項目並強制其重新載入,可以使用:

key.delete(use_datastore=False)

特殊關鍵字引數 optionsconfig (因歷史記錄而具有相同的意義) 可用於將數個選項指定為設定物件,可以是 ndb.ContextOptions 物件,或 (交易函式和裝飾項目) 的 ndb.TransactionOptions 物件。舉例來說,key.get(options=ndb.ContextOptions(use_cache=True)) 等同於 key.get(use_cache=True)。關鍵字參數可以覆寫這類選項物件中設定的選項。

可用的內容選項如下:

選項類型說明
deadline float 資料儲存庫呼叫期限,以秒為單位。 (根據預設,只有要求處理常式期限會中斷呼叫)。
read_policy ndb.EVENTUAL_CONSISTENCY 如果不想等候 Datastore 對所有傳回的記錄套用待處理的變更,而想更快取得可能並非最新的結果,請將此項設為 ndb.EVENTUAL_CONSISTENCY
force_writes bool 指定即使應用程式為唯讀,寫入要求是否仍應成功。 (這僅適用於使用者控制的唯讀期間)。
use_cache bool 指定是否要在程序內快取中儲存實體;覆寫這項作業的程序內快取政策。
use_memcache bool 指定是否將實體儲存在 Memcache 中;覆寫這項作業的 Memcache 政策。
use_datastore bool 指定是否要在 Datastore 中儲存實體,並覆寫這項作業的 Datastore 政策。
memcache_timeout int Memcache 中實體的存留時間上限;會覆寫這項作業的 Memcache 超時政策。
max_memcache_items int Context memcache 方法的自動批次處理功能批次大小上限。舉例來說,若預設大小是 max_memcache_items (100),則最多 100 個 memcache 組合作業會合併為單一 set_multi 作業。

某些與交易相關的函式可以使用下列交易選項 (以及上方所列的沿用內容選項):

選項類型說明
xg bool 允許跨群組 (XG) 交易。 預設為 False
propagation int

NDB 針對交易內的交易提供有限支援,這類交易稱為「巢狀交易」。

傳播參數用於控制程式碼嘗試開始巢狀交易時會發生的狀況。

@ndb.transactional 的傳播政策預設為 ALLOWED

ndb.transaction() 的傳播政策預設為 NESTED。 NDB 不支援 NESTED 政策,因此程式碼會擲回 BadRequestError 例外狀況。在此情況下,NDB 會設定不支援的預設值,讓程式設計師明確知道巢狀交易的限制。

傳播參數的值可以是以下任何一個值:

ndb.TransactionOptions.NESTED
如果外部政策提交,NESTED 傳播政策會一併提交外部和內部交易中的所有變更。不過,若例外狀況擲入到內部交易中,則系統會擲回該交易中的所有變更,只允許外部交易選擇性地復原並繼續。系統不支援 NESTED 政策。如果使用這項政策,程式碼會擲回 BadRequestError 例外狀況。
ndb.TransactionOptions.MANDATORY
一律傳播現有交易;如果沒有現有交易,則擲回例外狀況。 若使用此政策的函式擲回例外狀況,擷取例外狀況並提交外部交易可能並不安全;此函式可能會導致外部交易陷入不良狀態。
ndb.TransactionOptions.ALLOWED
若存在現有交易,則傳播該交易。 若使用此政策的函式擲回例外狀況,擷取例外狀況並提交外部交易可能並不安全;此函式可能會導致外部交易陷入不良狀態。
ndb.TransactionOptions.INDEPENDENT
一律使用新交易,並「暫停」所有現有交易。 使用這項政策的函式不應傳回在新交易中讀取的任何實體,因為這些實體與呼叫端的交易在交易上並不一致。
retries int 交易失敗時自動重試的次數。 零代表嘗試一次,但不會試。

在某些情況下,選項會因為快取的緣故而遭到選項。 舉例來說,如果您為讀取作業指定 RPC 期限,且內容快取能滿足這項讀取作業,就會忽略期限。另一方面,無法辨識的選項會導致 TypeError 引發。

套用自動批次處理功能時,系統會將選項不同的作業分成不同群組。舉例來說,如果您使用 put_async() 寫入一些實體,其中部分實體有 deadline = 5,部分則沒有,且所有實體都符合自動批次處理的條件,則自動批次處理器會發出兩次個別的 RPC 呼叫,一次是針對有 deadline = 5 的實體群組,另一次是針對其他群組,即使預設 RPC 期限也是 5 秒!即使您指定的選項與 RPC 作業無關 (例如 ndb_should_cache),仍然會是如此。