我继承了一个应用程序,该应用程序将实体键存储为字符串而不是实际键,因此它们当然不会被自动工具更新以迁移到 HRD 数据存储。
我可以以编程方式(如果可以,如何)将存储为字符串的键转换为代表新应用程序 ID 的新键的字符串?(撇开它们不应该首先存储为字符串的事实不谈)。
我继承了一个应用程序,该应用程序将实体键存储为字符串而不是实际键,因此它们当然不会被自动工具更新以迁移到 HRD 数据存储。
我可以以编程方式(如果可以,如何)将存储为字符串的键转换为代表新应用程序 ID 的新键的字符串?(撇开它们不应该首先存储为字符串的事实不谈)。
ndb
:new_key = ndb.Key(urlsafe=string_value_of_key)
并更改应用程序 ID,您可以__app
通过 public 属性访问受保护的属性_Key__app
new_key._Key__app = 'new-app-id'
db
:old_key = db.Key(encoded=string_value_of_key)
然后要将密钥转换为具有新应用 ID 的密钥,您可以使用
new_key = db.Key.from_path(*old_key.to_path(),
_app='new-app-id',
parent=old_key.parent(),
namespace=old_key.namespace())
幸运的是,有一种方法可以使用 Key Class。以下仅适用于没有父母的实体的键,但我相信这种方法可以推广到使用 Key 类的 parent() 方法的具有父母的实体。
您在 NEW 应用程序中运行此代码以获取新的密钥字符串:
old_key = db.Key('old_key_string_in_here')
new_key = db.Key.from_path(old_key.kind(), old_key.id())
new_key_string = str(new_key)