如何从GAE数据存储中删除列(属性)?

时间:2011-05-16 09:30:24

标签: database google-app-engine jdo datastore

我有一个存储在GAE数据存储区中的持久化类。我已从课程中删除了其中一个属性。此表中的新记录显示值<none&gt;对于已删除的属性。但有没有办法可以完全放弃这个专栏?

感谢。

根据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 个答案:

答案 0 :(得分: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()

或者您可以使用asynchronous query map

加快速度
@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)

答案 1 :(得分:6)

我在本文中找到了这个问题的答案: 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/

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

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