8

我有一个存储在 GAE 数据存储中的持久类。我已经从类中删除了其中一个属性。此表中的新记录显示<none已删除属性的值 >。但是有没有一种方法可以让我完全放弃这一列?

谢谢。

根据 moraes 的建议添加了以下“迁移”代码,但没有达到预期的结果:

PersistenceManager pm = PMF.get().getPersistenceManager();
try {
    Query q = pm.newQuery(UserLogin.class);
    Collection<UserLogin> list = (Collection<UserLogin>) q.execute();

    Iterator<UserLogin> iter = list.iterator();
    while (iter.hasNext()) {
        UserLogin obj = (UserLogin) iter.next();
        obj.setLoginDate(obj.getLoginDate());
    }

    pm.makePersistentAll(list); 

} finally {
    pm.close();
}
4

4 回答 4

7

我在这篇文章中找到了这个问题的答案: http ://code.google.com/appengine/articles/update_schema.html

"从数据存储中删除已删除的属性

如果您从模型中删除一个属性,您会发现现有实体仍然具有该属性。它仍将显示在管理控制台中,并且仍将存在于数据存储中。要真正清除旧数据,您需要循环访问实体并从每个实体中删除数据。

  • 确保您已从模型定义中删除属性。

  • 如果您的模型类继承自 db.Model,请暂时将其切换为继承自 db.Expando。(db.Model 实例不能动态修改,这是我们下一步需要做的。)

  • 循环浏览现有实体(如上所述)。对于每个实体,使用delattr删除过时的属性,然后保存实体。

  • 如果您的模型最初继承自 db.Model,请不要忘记在更新所有数据后将其改回。”

这是一个带有代码的示例: http: //sandrylogan.wordpress.com/2010/12/08/delattr/

于 2012-03-12T05:50:34.620 回答
7

如果您正在使用ndb(并且您可能应该),您可以通过从以下位置删除属性来轻松删除它们entity._properties

for entity in MyModel.query():
    if 'old_property' in entity._values:
        del entity._properties['old_property']
        del entity._values['old_property']
        entity.put()

或者您可以通过使用异步 查询映射使其更快:

@ndb.tasklet
def cleanup(entity):
    if 'old_property' in entity._values:
        del entity._properties['old_property']
        del entity._values['old_property']
        yield entity.put_async()

MyModel.query().map(cleanup)
于 2013-02-27T15:35:28.513 回答
5

数据存储中没有“表”的概念。每个实体都可以具有不遵循通用模式的任意属性。唯一的“模式”在您的模型代码中,当您更改模型时,现有记录不会自动更改。

因此,要从现有记录中删除该属性,您需要遍历所有记录并在没有该属性的情况下重新保存它们。

于 2011-05-16T11:31:23.577 回答
3

数据存储查看器从定期更新的数据存储统计信息中获取其列列表。如果您已从拥有该列的每个实体中删除该列,请等待一两天,数据存储查看器将停止显示它。

于 2011-05-16T22:06:19.040 回答