【问题标题】:Read db.StringListProperty from ndb从 ndb 读取 db.StringListProperty
【发布时间】:2016-07-13 02:11:47
【问题描述】:

我在 AppEngine 中有一个如下所示的数据库模型:

class MyModel(db.Model):
  my_list = db.StringListProperty()

有一些实体写入数据存储并填充了这些数据,我可以通过 DB 将它们拉出,然后在实体查看器中看到。我一直在努力迁移到 NDB,所以迁移的模型是:

class MyModel(ndb.Model):
  my_list = ndb.StringProperty(repeated=True)

但是当我从数据存储中取出实体时,my_list 永远不会被填充。检索这些实体有什么技巧吗?

【问题讨论】:

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


    【解决方案1】:

    我还没有 50 个代表,所以我不能在评论中提问,但是如果你复制粘贴了你的代码,我很确定你的问题是你仍然以“db”为前缀

    应该是

    my_list = ndb.StringProperty(repeated=True)
    

    https://cloud.google.com/appengine/docs/python/ndb/db_to_ndb#properties

    我们还尝试将索引保持在最低限度以降低数据存储写入成本,因此将 indexed=False 添加到它是我们一直在做的事情。

    my_list = ndb.StringProperty(repeated=True, indexed=False)
    

    如果这仍然不起作用,您可能需要一个中间函数来获取 DB 版本,并将其重写为 NDB 版本,但据我所知,这不应该是必要的(我还没有做过一个 DB->NDB 迁移我自己)

    如果您想知道,尽管 API 不同,NDB 和旧的 ext.db 包将完全相同的数据写入数据存储区。这意味着您不必对数据存储进行任何转换,并且您可以愉快地混合和匹配 NDB 和 ext.db 代码,只要您使用的模式是等效的。您甚至可以使用 ndb.Key.from_old_key() 和 key.to_old_key() 在 ext.db 和 NDB 密钥之间进行转换。

    【讨论】:

    • 感谢您指出这一点,这是一个换位/卫生错误。验证代码实际上使用“ndb”。一旦我达到可行的程度,通过 mapreduce 作业迁移数据可能是最终的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2021-01-17
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多