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

Database 如何从GAE数据存储中删除列(属性)?,database,google-app-engine,jdo,datastore,Database,Google App Engine,Jdo,Datastore,我在GAE数据存储中存储了一个持久类。我已经从类中删除了一个属性。此表中的新记录显示已删除属性的值。但是有没有办法让我把这一列从桌子上完全去掉呢 谢谢 根据moraes的建议添加了以下“迁移”代码,但未达到预期效果: PersistenceManager pm = PMF.get().getPersistenceManager(); try { Query q = pm.newQuery(UserLogin.class); Collection<UserLogin>

我在GAE数据存储中存储了一个持久类。我已经从类中删除了一个属性。此表中的新记录显示已删除属性的值
。但是有没有办法让我把这一列从桌子上完全去掉呢

谢谢

根据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();
}
PersistenceManager pm=PMF.get().getPersistenceManager();
试一试{
Query q=pm.newQuery(UserLogin.class);
集合列表=(集合)q.execute();
迭代器iter=list.Iterator();
while(iter.hasNext()){
UserLogin obj=(UserLogin)iter.next();
obj.setLoginDate(obj.getLoginDate());
}
pm.makePersistentAll(列表);
}最后{
pm.close();
}
数据存储中没有“表”的概念。每个实体可以具有不遵循公共模式的任意属性。唯一的“模式”在您的模型代码中,当您更改模型时,现有记录不会自动更改


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

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

我在本文中找到了此问题的答案:

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

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

  • 确保已从模型定义中删除特性

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

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

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

下面是一个代码示例:

如果您正在使用(而且您可能应该这样做),您可以通过从
实体中删除属性来轻松删除属性。_properties

for entity in MyModel.query():
    if 'old_property' in entity._values:
        del entity._properties['old_property']
        del entity._values['old_property']
        entity.put()
或者,您可以通过使用:


谢谢你的帮助。请参阅我的OP中的“迁移”代码。我的UserLogin类是持久类,不需要的字段已从中删除。但不知何故,我仍然在数据存储中的旧条目下看到
。我遗漏了什么吗?您需要调用pm.makePersistentAll()传递更改的实体,以保存它们并有效地排除不再存在的额外属性。我将该调用添加到方法中,但没有区别。请参阅我的OP中更新的代码。对于删除的属性值,我仍然可以看到
。谢谢。顺便说一句,我认为不需要pm.makePersistentAll(),因为更改将通过pm.close()调用自动保存。不管怎样,结果都是一样的。嘿,我认为“删除”应该改为“删除”,但这对我来说非常有效,谢谢。@RyanBavetta谢谢,修复了!
@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)