appEngine中的download_data和upload_data键差异

时间:2013-06-24 02:37:03

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

根据AppEngine documentation(引用如下),使用download_data和upload_data应该保留下载数据的原始密钥。

  

下载数据时,实体与其一起存储   原始钥匙。上载数据时,将使用原始密钥。   如果数据存储中存在与实体具有相同密钥的实体   正在上传,数据存储区中的实体将被替换。

我正在使用这两个命令:

appcfg.py download_data --oauth2 --url=https://myapp-id.appspot.com/_ah/remote_api --filename=testdata/gamedata

appcfg.py upload_data --url=http://localhost:9876/_ah/remote_api  --filename=testdata/gamedata

数据上传时使用相同的ID,但键不同,任何想法我做错了什么?或者是在本地devappserver中以不同方式计算密钥?

更新

添加一些数据以在prod和本地开发版本之间进行比较

生产密钥:ag9zfmF3ZXNvbWVzdGdhbWVyGAsSCENhdGVnb3J5IgrYo9is2YbYqNmKDA

从PROD下载data_data并将upload_data发送到localhost后,该键变为同一个对象:ahFkZXZ-YXdlc29tZXN0Z2FtZXIYCxIIQ2F0ZWdvcnkiCtij2KzZhtio2YoM

1 个答案:

答案 0 :(得分:2)

您需要在bulkloader配置中使用相应的转换,例如,如果您使用的是ids,那么

- kind: YourEntity
  connector: csv
  property_map:
    - property: __key__
      external_name: key
      export_transform: transform.key_id_or_name_as_string
      import_transform: transform.none_if_empty(transform.create_foreign_key('YourEntity', key_is_id=True))

    - property: more props...

会在前进的路上转换钥匙。

如果你有父母的实体,那么你需要在出路上分开并重新组合:

- kind: ChildEntity
  connector: csv

  property_map:
    - property: __key__
      external_name: childKey
      import_transform: transform.create_deep_key(('ParentEntity', 'parentKey', True),('ChildEntity', transform.CURRENT_PROPERTY, True))

      export:
        - external_name: parentKey
          export_transform: transform.key_id_or_name_as_string_n(0)

        - external_name: childKey
          export_transform: transform.key_id_or_name_as_string_n(1)