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

时间:2013-01-30 01:24:08

标签: 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)

1 个答案:

答案 0 :(得分:12)

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

以下是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)

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