【问题标题】:Python ORM for google-cloud-datastore用于 google-cloud-datastore 的 Python ORM
【发布时间】:2021-06-28 18:30:20
【问题描述】:

我已将第 1 代 GAE Python 2 应用程序迁移到第 2 代 GAE Python 3。这并不容易,但似乎一切正常。

我现在想从 google-cloud-ndb 迁移到 google-cloud-datastore。使用 google-cloud-datastore,是否可以以类似于子类化 ndb.Model 的方式子类化 Entity(这是一个 dict 子类)?

例如 google-cloud-ndb 代码如下所示:

from google.cloud import ndb

class Foo(ndb.Model):
    x = ndb.StringProperty(default='42')

    def do_something(self):
        pass

这是将上述内容迁移到 google-cloud-datastore 的正确方法吗?:

from google.cloud.datastore.entity import Entity

class Foo(Entity):

    def __init__(self):
        super().__init__()
        self['x'] = '42'

    def do_something(self):
        pass

我还没有看到任何这样的示例代码,所以我想确认这是一个很好的做法,尤其是在覆盖 __init__ 时。

更好的是,有没有办法将实体子类化,以便我可以将数据作为对象属性 (foo.x) 而不是作为字典 (foo['x']) 访问?这将使迁移变得更加容易。

【问题讨论】:

  • 您好,您有机会通过以下代码实验室吗?步骤 5 项目符号 3 分享了一些关于如何从 Cloud ndb 迁移到数据存储的好信息。 codelabs.developers.google.com/codelabs/…
  • @AntonioRamirez,是的,我在提问之前读过。
  • 正在解决这个问题但没有确定解决方案的项目:datastore-entitydatastore-orm
  • 我怀疑 google.cloud.datastore.entity.Entity 并不是要扩展的。过去几年,google-cloud-* 产品的 API 稳定性非常不稳定,因此我建议谨慎行事。

标签: google-app-engine google-cloud-datastore google-app-engine-python


【解决方案1】:

我怀疑我的问题中的解决方案不是一个好的解决方案,这样的解决方案会更好:

from google.cloud.datastore.entity import Entity

class Foo():

    x: str

    def __init__(self):
        super().__init__()
        self.x = '42'

    def do_something(self):
        pass

    def to_dict(self):
        return {'x': self.x}

    @staticmethod
    def from_dict(self, data):
        f = Foo()
        f.x = data['x']
        return f

很高兴能从已经经历过这件事的人那里获得反馈。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2016-12-27
    • 2016-11-16
    • 2020-12-30
    • 1970-01-01
    • 2021-10-31
    • 2023-03-20
    • 2018-02-14
    相关资源
    最近更新 更多