我有一个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)
答案 0 :(得分:12)
好消息是,您不必对持久数据进行任何更改,因为ext.db
和ndb
会读取和写入完全相同的数据。
以下是NDB Cheat Sheet:
的引用无需更改数据存储!
如果您想知道,尽管有不同的API,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)
我强烈建议您使用备忘单来帮助您进行迁移。