Appengine - 从标准数据库升级到NDB - 参考属性

7 投票
1 回答
2533 浏览
提问于 2025-04-17 14:08

我有一个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.dbndb 读取和写入的是完全相同的数据。

这里有一段来自 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)

我强烈推荐使用这个备忘单来帮助你进行迁移。

撰写回答