数据存储区中的 Google App Engine 版本控制

Posted

技术标签:

【中文标题】数据存储区中的 Google App Engine 版本控制【英文标题】:Google App Engine Versioning in the Datastore 【发布时间】:2011-08-29 03:06:06 【问题描述】:

Google App Engine 有应用版本的概念。即,您可以让应用程序的多个版本同时运行并在不同的子域中访问。例如:http://1.my-app-name.appspot.comhttp://2.my-app-name.appspot.com

应用程序的哪些方面实际上被“版本化”了?它只是 Python + 静态文件代码库吗?数据存储是否有“版本”的概念?如果不是,那么当我更新 Google App Engine 模型的定义时会发生什么?

谢谢!

【问题讨论】:

【参考方案1】:

正确,应用版本仅指您上传的文件。两个版本都使用同一个数据存储。

请注意,数据存储本身是无模式的。每个实体都是键/值对的独立集合。相同种类的两个实体不必共享同一组属性或属性类型。 db.Model 围绕数据存储提供 ORM 抽象,但不定义或强制执行任何类型的全局模式。

虽然 datstore 没有版本控制,但它确实支持 namespacing。如果您希望应用程序的每个主要版本都有一个新的数据存储段,您可以这样做:

import os
from google.appengine.api import namespace_manager

namespace_manager.set_namespace(os.environ['CURRENT_VERSION_ID'])

【讨论】:

应该可能拆分版本字符串并根据主要版本值创建命名空间。 major_ver, minor_ver = os.environ.get('CURRENT_VERSION_ID').rsplit('.', 1); namespace_manager.set_namespace(major_ver) 次要版本值会随着每次部署而变化,即使您不更改主要版本值。 好电话,出于某种原因,我认为它只返回主要版本。 这是一个很好的例子,当我正在寻找一个关于如何使用命名空间的具体示例的介绍时,我就不必使用 GQL IN,这反过来又使我能够使用更大的游标和更多有效的分页,如果这个计划可行的话。 好答案,但请记住,相同的数据存储索引适用于所有命名空间中的所有实体。 您是否会说使用命名空间对数据存储进行分段以支持多个实例版本,每个版本都有“他们自己的数据凝视”“”是一个好方法吗?【参考方案2】:

Datastore 没有版本的概念。

当您更新模型定义时,您将来创建的任何实体都将属于新类型,而旧实体将属于旧类型。如果您的代码不知道这些更改,这通常会导致运行时错误。

【讨论】:

此外,索引将(最终)反映最近上传的 index.yaml

以上是关于数据存储区中的 Google App Engine 版本控制的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 数据存储区中不精确查询的良好模式是啥?

在 Google App Engine 上的数据存储区中更新大量实体

计算在 Google App Engine 数据存储区中计算分数和日期的索引

Google App Engine 数据存储区中每秒写入 5 次以上的事务计数器

put() 后 App Engine 数据存储区中的读取延迟

Google App Engine Datastore 中的索引和索引条目限制