如何从数据流获取数据存储实体urlsafe

时间:2018-10-15 10:53:41

标签: google-cloud-datastore google-cloud-dataflow apache-beam

反正有没有在数据流中获取数据存储实体旧版urlsafe的信息?

我尝试了一些方法,但是都失败了……

  1. 直接编码

    base64.urlsafe_b64encode(key.SerializeToString()).strip(b'=')
    

    =>与appengine相比不一样

  2. 导入google.cloud.datastore.key

    =>似乎与数据流datastoreio冲突?

  3. 从google.cloud.datastore复制_app_engine_key_pb2.py并像to_legacy_urlsafe()源代码一样使用它

    elements = []
    for part in key.path:
        element_kwargs = {'type': part.kind}
        if part.id:
            element_kwargs['id'] = part.id
        elif part.name:
            element_kwargs['name'] = part.name
        element = _app_engine_key_pb2.Path.Element(**element_kwargs)
        elements.append(element)
    legacy_path = _app_engine_key_pb2.Path(element=elements)
    reference = _app_engine_key_pb2.Reference(
        app=key.partition_id.project_id,
        path=legacy_path,
        name_space=key.partition_id.namespace_id
    )
    raw_bytes = reference.SerializeToString()
    urlsafe = base64.urlsafe_b64encode(raw_bytes).strip(b'=')
    

    =>与appengine相比还是不一样...

1 个答案:

答案 0 :(得分:0)

ndb代码具有:

urlsafe = base64.b64encode(self.reference().Encode())
return urlsafe.rstrip('=').replace('+', '-').replace('/', '_')

因此,您应该获得与以下结果相同的结果:

urlsafe = base64.b64encode(key.SerializeToString())
return urlsafe.rstrip('=').replace('+', '-').replace('/', '_')

您正在使用ndb还是db库?您发现的to_legacy_urlsafe()函数似乎与数据库库匹配。