Appengine - 从标准DB升级到NDB - ReferenceProperties

Ale*_*rdt 7 python database google-app-engine datastore

我有一个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)
Run Code Online (Sandbox Code Playgroud)

Sea*_*nch 12

好消息,你不必让您持久数据的任何变化,ext.db以及ndb读取和写入数据完全相同.

以下是NDB备忘单的引用:

无需更改数据存储!

如果您想知道,尽管有不同的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)
Run Code Online (Sandbox Code Playgroud)

后:

class MailMessage(ndb.Model):
    m_text = ndb.TextProperty()
    m_from = ndb.KeyProperty(kind=UserModel)
    m_to = ndb.KeyProperty(kind=UserModel)
Run Code Online (Sandbox Code Playgroud)

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