以编程方式为新的应用程序ID转换数据存储区键的字符串? (主/从 - > HRD迁移)

时间:2012-12-09 17:37:01

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

我继承了一个应用程序,它将实体密钥存储为字符串而不是实际密钥,因此当然它们不会被自动工具更新以迁移到HRD数据存储区。

我可以通过编程方式(如果是这样,如何)将存储为字符串的密钥转换为表示新应用程序ID的新密钥的字符串吗? (撇开它们不应该首先存储为字符串的事实。)

2 个答案:

答案 0 :(得分:2)

如果您使用ndb

new_key = ndb.Key(urlsafe=string_value_of_key)

要更改应用ID,您可以通过公开属性__app

访问受保护的属性_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())

答案 1 :(得分:1)

谢天谢地,使用Key Class。以下仅适用于没有父母的实体的密钥,但我相信这种方法可以推广给父母使用Key类的parent()方法的实体。

您在新应用中运行此代码以获取新的密钥字符串:

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)