Appengine - 从标准数据库升级到NDB - 参考属性
我有一个AppEngine的应用程序,正在考虑升级到使用NDB数据库。
在我的应用中,有数百万个对象使用的是旧式的数据库引用。我想知道,怎样才能最好地将这些ReferenceProperty的值转换成KeyProperty的值,或者有没有其他解决方案可以让我顺利升级到NDB。
(我希望这个过程不需要对数据库中的所有元素进行大规模的批处理,也就是说,不想通过ReferenceProperty来计算KeyProperty——如果能有个优雅的解决方案就更好了)
我想要升级的模型示例如下,从db.Model变成ndb.Model:
class UserModel(db.Model):
....
class MailMessageModel(db.Model):
m_text = db.TextProperty()
m_from = db.ReferenceProperty(reference_class = UserModel)
m_to = db.ReferenceProperty(reference_class = UserModel)
1 个回答
12
好消息是,你不需要对你存储的数据做任何改动,因为 ext.db
和 ndb
读取和写入的是完全相同的数据。
这里有一段来自 NDB备忘单 的引用:
不需要更改数据存储!
如果你在想,尽管有不同的接口,NDB 和旧的 ext.db 包写入的数据是完全一样的。这意味着你不需要对你的数据存储进行任何转换,只要你使用的结构是相同的,你就可以随意混合使用 NDB 和 ext.db 的代码。你甚至可以使用 ndb.Key.from_old_key() 和 key.to_old_key() 在 ext.db 和 NDB 的键之间进行转换。
这个备忘单是转换你的模型定义的好帮手。例如,修改你的 MailMessageModel
应该很简单:
之前:
class MailMessage(db.Model):
m_text = db.TextProperty()
m_from = db.ReferenceProperty(reference_class=UserModel)
m_to = db.ReferenceProperty(reference_class=UserModel)
之后:
class MailMessage(ndb.Model):
m_text = ndb.TextProperty()
m_from = ndb.KeyProperty(kind=UserModel)
m_to = ndb.KeyProperty(kind=UserModel)
我强烈推荐使用这个备忘单来帮助你进行迁移。