My favorites | 中文(繁體) | Sign in
英文版或許有比此中譯版新的內容

Datastore Python API 總覽

「Google 應用服務引擎」資料存放區為您的網路應用程式,提供可擴充的完整資料儲存服務。資料存放區以網路應用程式為設計概要,著重於讀取和查詢的效能表現,可儲存具備屬性的資料實體,並依照應用程式定義種類組織整理。資料存放區可以對相同種類的實體執行查詢,還可以進一步篩選或排序其屬性值和屬性金鑰。為了在龐大資料集中快速取得結果,所有查詢均會預先設定索引。資料存放區使用應用程式所定義的實體分組做為分散式資料網路的交易單位,進而支援交易式更新。

資料存放區簡介

「應用服務引擎」的資料存放區會對資料物件 (亦即「實體」) 儲存和執行查詢。實體擁有一或多個「屬性」;而屬性是幾種支援資料類型的其中一種已命名值,且可以是其他實體的參照。

資料存放區可以在單一交易中執行多個操作,並於任何一項操作失敗時,復原整個交易。這對分散式網路應用程式特別有用,因為在此類應用程式中,可能會出現多位使用者同時存取或操縱相同資料物件的情形。

與傳統資料庫不同,資料存放區使用分散式架構來支援非常龐大的資料集。應用服務引擎的應用程式可以透過描述資料物件之間的關聯,以及透過定義查詢的索引,來最佳化資料分散的方式。

「應用服務引擎」資料存放區的一致性十分明顯,卻不是關聯式資料庫。雖然資料存放區介面的許多功能與傳統資料庫相同,但是資料存放區也擁有獨一無二的特性,可透過完全不同的資料設計和管理方式,展現自動調整的優勢。

利用 Python 建立資料模型

資料存放區實體「沒有結構」:兩個相同種類的實體不需具備相同屬性,而相同屬性也不需使用相同值類型。應用程式必須確保實體在需要時符合結構。因此,Python SDK 包含具備資料模型功能的 Rich 程式庫,可輕鬆強制執行結構描述。

在 Python API 中,模型會描述實體的種類,包括其屬性的類型和設定。應用程式使用 Python 類別來定義模型,並使用類別屬性 (attribute) 來描述屬性。某一種類的實體是由相應模型類別的實例所代表,並以實例屬性 (attribute) 代表屬性值。可經由呼叫類別的建構函式來建立實體,然後呼叫 put() 方法進行儲存。

import datetime
from google.appengine.ext import db
from google.appengine.api import users

class Employee(db.Model):
  name = db.StringProperty(required=True)
  role = db.StringProperty(required=True, choices=set(["executive", "manager", "producer"]))
  hire_date = db.DateProperty()
  new_hire_training_completed = db.BooleanProperty()
  account = db.UserProperty()

e = Employee(name="",
             role="manager",
             account=users.get_current_user())
e.hire_date = datetime.datetime.now()
e.put()

Datastore API (資料存放區 API) 提供兩種查詢介面:查詢物件介面以及類似 SQL 的查詢語言 (稱為 GQL)。查詢會以模型類別實例的型式傳回實體,可以修改和放回資料存放區。

training_registration_list = [users.User("Alfred.Smith@example.com"),
                              users.User("jharrison@example.com"),
                              users.User("budnelson@example.com")]
employees_trained = db.GqlQuery("SELECT * FROM Employee WHERE account IN :1",
                                training_registration_list)
for e in employees_trained:
    e.new_hire_training_completed = True
    db.put(e)

實體與屬性

「應用服務引擎」資料存放區中的資料物件稱為「實體」。實體具有一或多個「屬性」;而屬性是幾種支援資料類型的其中一種已命名值,包括整數、浮點值、字串、日期、二進位資料和其他資料。

每個實體也具有可唯一識別該實體的金鑰。最簡單的金鑰有資料存放區所提供的種類和唯一的數字 ID。此 ID 也可以是應用程式所提供的字串。

應用程式可以透過金鑰,或透過比對實體屬性的查詢,從資料存放區擷取實體。查詢可能傳回零或多個實體,可以傳回以屬性值排序的結果。查詢也可以限制資料存放區傳回的結果數量,以節省記憶體和執行時間。

「應用服務引擎」資料存放區不會要求指定種類的所有實體都具有相同的屬性。這一點與關聯式資料庫不同。應用程式可以使用 SDK 所包含的程式庫或自有程式碼,指定或強制資料模型。

屬性可擁有一或多個值。具有多個值的屬性可擁有混合類型的值。查詢具有多個值的屬性,可測試是否有值符合查詢條件。因此,此類屬性在驗證會員資格時十分實用。

查詢和索引

「應用服務引擎」資料存放區查詢會在指定種類 (資料類別) 的每個實體上執行,進而對實體屬性值和屬性金鑰,指定零或多個篩選器以及排序順序。如果查詢篩選器和排序順序所提及的實體屬性均擁有至少一個值 (可能為空值),且屬性值符合所有篩選條件,則系統會傳回實體做為查詢結果。

每個資料存放區查詢都會使用索引,而索引是一個表格,當中列有依需求排序的查詢結果。「應用服務引擎」應用程式是透過設定檔定義其索引。如果開發網頁伺服器遇到尚未設定索引的查詢,就會自動將建議新增至這個檔案。您可以在上傳應用程式之前編輯該檔案,以手動調整索引。如果應用程式變更了資料存放區實體,資料存放區就會以正確的結果來更新索引。應用程式執行查詢時,資料存放區會直接從相應的索引擷取結果。

此機制支援的查詢種類十分廣泛,因此也適合大部分應用程式。不過,此機制並不支援您在其他資料庫技術所慣用的部分查詢種類。

交易和實體群組

使用「應用服務引擎」資料存放區時,每個嘗試建立、更新或刪除實體的動作都是在「交易」中進行。交易可確保實體的所有變更都儲存在資料存放區,或在操作失敗時復原這些變更,以保證實體中資料的一致性。

您可以使用 Transaction API (交易 API),在單一交易中對實體執行多項動作。舉例來說,如果您要增加某個物件中的計數器欄位值,您必須讀取計數器的值、計算新的值,再予以儲存。如果沒有交易,其他程序可能會在您讀取和更新的空檔中,增加計數器數值,導致應用程式覆寫已更新的值。在單一交易中執行讀取、計算和寫入可以防止其他程序干擾增加計數的過程。

您可以在單一交易中,對多個實體進行變更。為了支援這項功能,「應用服務引擎」必須事先瞭解哪些實體會同時更新,才能以支援交易的方式儲存這些實體。建立實體時,您必須宣告此實體與其他實體屬於相同的「實體群組」。所有在交易中擷取、建立、更新或刪除的實體,均需屬於相同的實體群組。

實體群組是由實體關聯性的階層所定義。如要在群組中建立實體,您必須宣告實體是群組中另一個實體的「子系」,而另一個實體則是「父系」。沒有父系的已建立實體是「根實體」,而沒有子系的根實體則是單獨存在於某個實體群組中。每個實體與根實體之間,都擁有父子式關聯性路徑 (無父系的實體擁有最短的路徑)。此路徑是實體完整金鑰的重要元素。在路徑中,每個實體的種類與 ID 或金鑰名稱均可代表完整金鑰。

資料存放區使用「開放式同步存取」管理交易。當應用程式的執行個體對實體群組中的實體套用變更時,其他嘗試更新群組實體的動作會立即失敗。應用程式可以再次嘗試交易,以套用更新資料。

配額和限制

對 Datastore API (資料存放區 API) 的每次呼叫會算入「資料存放區 API 呼叫」的配額中。請注意,某些程式庫呼叫程序會造成多次對基礎資料存放區 API 的呼叫。

應用程式傳送至資料存放區的資料會算入「傳送至 (資料存放區) API 的資料」的配額中。應用程式從資料存放區接收的資料會算入「從 (資料存放區) API 接收的資料」的配額中。

儲存在資料存放區的資料總數不得超過「已儲存資料 (可調整)」的配額。這包含實體屬性和金鑰,但是「不包括」索引。

資料存放區作業所使用的 CPU 時間長度則需遵循下列配額:

  • CPU 時間 (可調整)
  • 資料存放區 CPU 時間

如需瞭解配額的詳細資訊,請參閱「配額」,或參閱「管理控制台」的「配額詳細資訊」一節。

除了配額之外,使用資料存放區時也需遵循下列限制:

限制 數量
實體大小上限 1 MB
實體索引中值的數量上限 (1) 1000 個值
批次置放或批次刪除實體的數量上限 500 個實體
批次取得實體的數量上限 1000 個實體
查詢結果數量上限的位移 1000
  1. 在單一索引裡,實體會在每個指向實體的欄 × 列中使用單一的值;每個索引皆適用。如果已設定索引的屬性擁有多個值,因而需要含有多個重複列的索引表格,則實體的索引值數量可能會增加。