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

| 我在GAE数据存储区中存储了一个持久类。我从类中删除了其中一个属性。该表中的新记录显示已删除属性的值“ 0”。但是,有什么办法可以将表格中的该列完全删除? 谢谢。 根据moraes的建议添加了以下“ migration”代码,但未达到预期的效果:
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();
}
    
已邀请:
我在本文中找到了此问题的答案: 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/     
如果您使用的是
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)
    
数据存储区中没有“表”的概念。每个实体可以具有不遵循通用模式的任意属性。唯一的“模式”在您的模型代码中,并且当您更改模型时,现有记录不会自动更改。 因此,要从现有记录中删除该属性,您需要遍历所有记录并重新保存不包含该属性的记录。     
数据存储查看器从数据存储统计信息中获取其列列表,这些列表会定期更新。如果您已从拥有该列的每个实体中删除该列,请等待一两天,然后数据存储查看器将停止显示该列。     

要回复问题请先登录注册