2012-08-31 42 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

相关问题