繁体   English   中英

资料储存库和应用程式版本如何在GAE / J上运作

[英]How do Datastore and App versions work on GAE/J

一个人可以在GAE / J上部署同一应用程序的多个版本,但是GAE / J如何处理不同版本可以使用不同数据存储(以及可能不兼容)方案的事实?

例:

假设在我的应用程序的版本1中,我有一个POJO(为了简单起见,我省略了一些细节):

public class User {

  private String key;

  private String username;

  private Integer phoneNumber;

}

现在假设在版本2中,我想使用:

public class User {

  private String key;

  private String username;

  // on this version, replaced 'phoneNumber' by: 
  private String eMail;

}

现在有两个问题:

  1. 如果我同时在GAE / J中部署两个版本,则在数据存储区中会看到什么架构?

  2. 数据本身呢? 如果在版本2上添加用户,我是否会在版本1的数据存储区中看到其数据?

引用文档

与关系数据库不同,App Engine数据存储区不要求给定种类的所有实体都具有相同的属性。 应用程序可以使用SDK随附的库或自己的代码来指定和执行其数据模型。

这也被称为“软模式”-数据存储区实际上并不模式,但是您可以或多或少地通过应用程序级代码(您自己的或在库中)模拟某种软模式。

因此,如果您(通过库或在您自己的代码中)强制执行一个约束,指出“必须存在此属性”,并且某个实体实际上不具有该属性(因为它是基于不同的“软模式”插入的) ,例如应用程序的其他版本),那么在检查约束时,您将获得应用程序级代码或库选择用来表示违反此软约束的任何异常。

如果没有表达这样的约束,那么缺少的属性要么具有代码或库提供的默认值,要么具有“默认默认值”,我相信在Java中通常为null ,而在Python中通常为None

请注意,不同版本的应用程序可能使用不同的运行时(某些运行时可能是Java,而其他运行时可能是Python),并且不同的运行时仍将使用同一数据存储区,因此Java与Python的区别在这里并不重要。

在您的特定示例中(没有提供默认值,也没有对强制性存在做出任何断言),我希望从任一版本中添加用户都可以使其在另一个版本中可见,而缺少的属性则被视为null (但是可能存在一些约束,我不知道,在这种情况下,当库尝试验证那些约束并且看到它们受到违反时,应该导致异常。

一般而言,我不必担心添加“可选”属性(在某些情况下可能会丢失/ null / None或具有显式默认值,以便仍能正确读取由较早版本编写的实体的属性),但是其他类型的更改(强制使以前丢失或可选的属性为强制性,添加其他约束等)可能需要某种形式的“数据库迁移”(可能通过Secure Data Connector)或“应用程序级hacks以实现旧兼容性”,如果迁移是不可行的。

例如,迁移可能不可行,特别是如果您需要回滚到以前的应用程序版本的能力(实际上,在这种情况下,其他操作会出现问题,例如,删除约束与添加约束一样有问题,因为旧版本可能是无法处理新数据中输入的数据,这些数据违反了新版本中已删除的约束。

因此,在实际中这并不一定是简单的问题,但仍可以这样思考:数据存储区本身没有架构,只有我的应用程序和/或它选择使用的库在应用程序级别上强制执行任何约束,基础实体本身实际上具有一组任意属性-“软模式”,应用程序级模式,在基础数据层中没有“实际”模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM