Database 如何从GAE数据存储中删除列(属性)?
我在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>
。但是有没有办法让我把这一列从桌子上完全去掉呢
谢谢
根据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)