我有一个存储在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();
}
答案 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)
数据存储区查看器从数据存储区统计信息中获取列的列表,这些列将定期更新。如果您已从拥有该列的每个实体中删除该列,请等待一两天,数据存储区查看器将停止显示该列。