我有一个谷歌应用程序引擎应用程序,我想扩展我的一个实体定义。我如何确保存在的实体对象获得正确初始化的新字段?下一次查询它们时,存在的对象是否仅具有默认值?我想添加一个StringListProperty。谷歌应用程序引擎:如何添加字段到现有的实体
4
A
回答
5
如果您向模型添加新属性,那么当您加载它们时,如果您提供了默认值,则现有实体将具有默认值。尽管如此,他们不会在查询中显示该值,直到您获取并再次存储它们。
5
您将不得不将该属性逐个添加到所有现有实体。
您没有提及您正在使用哪种语言或API。程序的确切细节会因您的情况而有所不同。
通常,最安全的方法是使用不验证实体的API加载每个实体。在python中,你可以使用Expando模型。在Java中,您可以使用低级数据存储区API。 (使用JDO或JPA尝试此操作可能不起作用)您现在需要遍历所有现有实体。 (尝试使用新的Mapper API来做到这一点,而不是大惊小怪)。对于每个实体,您将加载它,添加新的属性,然后将其保存回数据存储。现在,您可以安全地返回到验证实体的框架,如JDO或非expando模型。
此方法适用于修改属性的类型或删除属性。
我很满意提供默认值(正如尼克约翰逊的回答所暗示的)。您的解决方案是否解决了比这种情况更复杂的问题,例如新属性的价值取决于每个实体实例的具体情况? – Joey 2010-07-26 08:06:05
@Joey尼克的解决方案更容易为你的情况。更改属性的类型或删除属性将需要更复杂的方法。 – 2010-08-01 16:38:42