2012-08-31 45 views
0

我對名稱空間在App Engine(python)中的工作方式感到困惑。我已閱讀https://developers.google.com/appengine/docs/python/multitenancy/multitenancy#Using_Namespaces_with_the_Datastore並遵循其建議,但爲什麼此代碼有效?它不應該使用「get」中的「當前」命名空間嗎?爲什麼App Engine命名空間在我不指望它們時被應用?

namespace_manager.set_namespace("foo") 
t = model.Track(description="in foo namespace") 
t.put() 

namespace_manager.set_namespace("bar") 
# Why doesn't this line fail? 
x = model.Track.get(t.key()) 
x.delete() 

回答

3

該命名空間是密鑰的一部分。

只有在不明確指定另一個名稱空間時,纔會考慮使用名稱空間管理器定義的名稱空間,例如,當創建一個新的實體。換句話說,當生成一個新密鑰時,用namespace_manager.set_namespace設置的名稱空間被注入到密鑰中。從那時起,密鑰包含關於實體「位置」(甚至應用ID)的完整信息,並且足以檢索它。

閱讀https://developers.google.com/appengine/docs/python/datastore/keyclass#Key_namespace

+0

謝謝。我提到的原始頁面說:「大多數使用數據存儲(put/query/get)而不使用其他存儲機制的簡單應用程序將在調用任何數據存儲API之前通過設置當前名稱空間而按預期工作。」這顯然是錯誤的。 – dplass

+0

您的代碼中的功能不是數據存儲API。有兩類數據存儲功能 - google.appengine.api.datastore *和google.appengine.ext.db。假設他們分別是低級別和高級別。雖然我對前者瞭解不多,但您不能認爲適用於API的內容也適用於分機。 – Bugs

相關問題