【问题标题】:How to get datastore entity urlsafe from dataflow如何从数据流中获取数据存储实体 urlsafe
【发布时间】:2018-10-15 10:53:40
【问题描述】:

有没有办法在数据流中获取数据存储实体旧版 urlsafe?

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

  1. 直接编码

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

    => 和 appengine 不一样

  2. 导入 google.cloud.datastore.key

    => 似乎与 dataflow 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 相比还是不一样...

【问题讨论】:

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


    【解决方案1】:

    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() 函数似乎与 db 库匹配。

    【讨论】:

    • 我使用ndb,你的方法看起来像我的方法1,有更多的替换规则。但是我得到的 urlsafe 和 'ahooxxooxx' 和 'Cwxyzxyzxyz' 很不一样......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多