将NDB urlsafe密钥字符串转换为googledatastore.Key

时间:2014-07-31 06:53:11

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

我希望能够在ndb和googledatastore python library之间共享ndb.key.urlsafe()个字符串

  • 是否有人有转换示例来构建googledatastore.Key字符串中的ndb.key.urlsafe()
  • 并且,从googledatastore.Key构建urlsafe字符串的示例也很好

我还制作了github issue

编辑:请注意,googledatastore具有Seri​​alizeToString()和FromString()但这是基于protobuff并且不接受ndb密钥字符串

3 个答案:

答案 0 :(得分:1)

ndb.to_old_key()怎么样,这不正是你想要的?

https://developers.google.com/appengine/docs/python/ndb/keyclass#Key_urlsafe

答案 1 :(得分:1)

您可能需要自己做一些工作,因为Cloud Datastore和ndb以不同的格式进行通话。由于ndb' urlsafe是它自己的函数(base64编码加上一些格式化的东西),我建议使用ndb来读取urlsafe格式,然后将其转换为Cloud Datastore密钥:

urlsafeKey = '....'
# First, let ndb deserialize the key.
ndbKey = ndb.Key(urlsafe=urlsafeKey)
# Rebuild the Cloud Datastore key using the path from ndb.
cloudKey = googledatastore.datastore_v1_pb2.Key()
for pair in ndbKey.pairs():
  googledatastore.helper.add_key_path(cloudKey, pair[0], pair[1])

如果你想从googledatastore密钥转到ndb序列化密钥,你可以做同样的事情但反过来。

pairs = []
for path_element in cloudKey.path_elements:
  if path_element.HasField('name'):
    id_or_name = path_element.name
  else:
    id_or_name = path_element.id
  pairs.append((path_element.kind, id_or_name))
ndbKey = ndb.Key(pairs=pairs)

免责声明:我实际上并没有运行代码,因此您可能需要稍微处理一下。

答案 2 :(得分:0)

我已经要求同事从appengine库中提取代码。结果如下:https://github.com/transceptor-technology/dbWrapper/blob/master/gcdKeyNdbKey.py

它公开了以下功能: from gcdKeyNdbKey import gcdKeyFromUrlSafe from gcdKeyNdbKey import urlSafeFromGcdKey