【问题标题】:Appengine - Upgrading from standard DB to NDB - ReferencePropertiesAppengine - 从标准 DB 升级到 NDB - ReferenceProperties
【发布时间】:2013-01-13 17:55:39
【问题描述】:

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

【问题讨论】:

    标签: python database google-app-engine datastore


    【解决方案1】:

    好消息,您不必对持久化数据进行任何更改,因为 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)
    

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

    【讨论】:

    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2020-10-20
    相关资源
    最近更新 更多