【问题标题】:How can I query Google App Engine entities by name to convert to new names?如何按名称查询 Google App Engine 实体以转换为新名称?
【发布时间】:2015-08-17 09:05:26
【问题描述】:

我想将一些实体转换为新名称。如何查询未定义模型类的实体。

例如我有这样的实体(它简化为更具可读性):

class Some(ndb.model):
  name = ndb.StringProperty()

我想把它重命名为:

class SomeFile(ndb.model):
  name = ndb.StringProperty()

我该怎么做?

如果将Some 重命名为SomeFile,则将不再有Some 可供查询,而只有数据存储区中的数据。

【问题讨论】:

    标签: python-2.7 google-app-engine google-app-engine-python


    【解决方案1】:

    您可以更改模型类名称,并通过覆盖模型的 _get_kind() 方法使其指向现有数据存储区 Kind

    class SomeFile(ndb.Model):
        @classmethod
        def _get_kind(cls):
          return 'Some'
    

    现在您可以在 Python 代码中使用 SomeFile,同时在数据存储中保留 Some 实体。

    https://cloud.google.com/appengine/docs/python/ndb/modelclass#introduction

    【讨论】:

    • 这是一些想法。无论我想更改所有名称以简化代码。我更喜欢 X 是 X 而不是 X 是 Y。
    • 好吧,您已经删除了旧型号名称,因此这是您的选择,或者您可以像其他答案一样临时替换旧型号进行交换。
    【解决方案2】:

    也许我不明白你的问题,但这就是你想要的吗?:

    for x in Some.query():
        y = SomeFile()
        y.name = x.name
        y.put()
        x.key.delete()
    

    虽然你应该通过分批来提高效率。

    【讨论】:

    • 我无法工作,您假设类 Some 存在但将被替换,并且 Some 将被删除,因为代码已死。我无法维护死代码,因为它会阻碍开发。
    • 我不明白您的评论...如果class Some() 不存在,那么只需将其创建为 Expando,这样您就无需列出属性。转换后,您删除了 class Some() 的这个简单定义,因此您不会维护死代码。
    • 很简单,我不能拥有 Some(ndb.Model) 因为此代码必须在更新后删除而不是保留 - 考虑到在 100 个补丁后我将拥有 50 个 Some(epxando) ... - 那不吃死的东西是个问题。
    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2012-12-27
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多