谷歌应用引擎数据存储中的版本控制

15

谷歌应用引擎具有应用程序版本的概念。也就是说,您可以同时运行多个版本的应用程序,并在不同的子域上访问这些版本。例如:http://1.my-app-name.appspot.comhttp://2.my-app-name.appspot.com

这个版本控制实际上是针对应用程序的哪些方面?是仅针对Python +静态文件代码库吗?数据存储是否具有“版本”概念?如果没有,那么当我更新Google应用引擎模型的定义时会发生什么?

谢谢!

2个回答

26

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

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

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

import os
from google.appengine.api import namespace_manager

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

4
可能需要拆分版本字符串并根据主要版本值创建命名空间。major_ver, minor_ver = os.environ.get('CURRENT_VERSION_ID').rsplit('.', 1); namespace_manager.set_namespace(major_ver) 即使您不更改主要版本值,次要版本值也会随每个部署而变化。 - Calvin
好的,我的理解出了点问题,我以为它只返回主版本号。 - Drew Sears
这是一个很好的例子,当我正在寻找一个具体的示例来介绍如何使用命名空间,这样我就不必使用GQL IN,反过来,这将使我能够为更大和更高效的分页使用游标,如果这个计划成功的话。 - Niklas Rosencrantz
1
不错的回答,但请记住,相同的数据存储索引适用于所有命名空间中的所有实体。 - Zsolt Safrany
你认为使用命名空间对数据存储进行分段,以支持每个实例版本都有“自己的数据存储”是一个好的方法吗? - Tim

7

Datastore没有版本概念。

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


1
此外,索引将(最终)反映最近上传的index.yaml。 - Dave W. Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接