7

我有一个 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)
4

1 回答 1

12

好消息是,您不必对持久化数据进行任何更改,因为读取ext.dbndb写入完全相同的数据。

这是NDB 备忘单的引述:

无需更改数据存储!

如果您想知道,尽管 API 不同,NDB 和旧的 ext.db 包将完全相同的数据写入 Datastore。这意味着您不必对数据存储进行任何转换,并且您可以愉快地混合和匹配 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)

我强烈建议您使用备忘单来帮助您进行迁移。

于 2013-01-30T01:50:13.893 回答