【问题标题】:App Engine bulkloader - Loading Entities with parent keys?App Engine bulkloader - 使用父键加载实体?
【发布时间】:2014-03-01 09:50:15
【问题描述】:

似乎很少有关于使用 App Engine 的批量加载程序加载具有父键的实体的信息。 我尝试按照我在 StackOverflow 上找到的说明进行操作...

Uploading Entity with Parent Using Bulkloader

但一定有什么我还没有得到。 我希望大家能提供帮助。

我正在尝试加载新实体并为它们提供数据存储区中已有实体的父键。 父实体基本上只是一个“管理员”实体。我希望属于管理员的所有“汽车”实体都拥有这个父密钥。这样我就可以轻松地只搜索那些汽车。

admin.yml 和 admin.csv 如下...(我跳过序言和“变形金刚”)

管理员.YML

    - kind: Admin
      connector: csv

      property_map:

            - property: __key__
              external_name: adminKey
              export_transform: transform.key_id_or_name_as_string

            - property: email
              external_name: email

管理员.CSV

    email
    foo@foo.com

这很好用。创建了一个 Admin 实体。

现在我想将此实体用作我接下来加载的“汽车”实体的父级。 car.yml 和 car.csv 在下面...(再次跳过序言和“变压器”)

CAR.YML

    - kind: Car
      connector: csv

      property_map:

            - property: __key__ 
              external_name: carKey
              import_transform: transform.create_deep_key(('adminKey', 'adminKey'),('carKey', transform.CURRENT_PROPERTY))

              export:
              - external_name: adminKey
                export_transform: transform.key_id_or_name_as_string_n(0)
              - external_name: carKey
                export_transform: transform.key_id_or_name_as_string_n(1)

            - property: manufacturer
              external_name: manufacturer

            - property: model
              external_name: model

CAR.CSV

    manufacturer,model
    Chevrolet,Impala
    Ford,Focus

每次我使用 car.csv 运行 car.yml 时,我都会收到以下消息:

[ERROR] WorkerThread-0 中的错误:“adminKey”

此时我只是迷路了。 发布链接很可能无济于事。我可能都看过了,但似乎仍然无法理解。

提前致谢。

【问题讨论】:

  • 嗨,解决办法是什么?

标签: google-app-engine yaml bulkloader


【解决方案1】:

正确的语法是transform.create_deep_key((kind, value),(kind, value),...)

你需要这样的东西:

transform.create_deep_key(('Admin', 'adminKey'),('Car', transform.CURRENT_PROPERTY))
                              ^          ^         ^               ^
                        parent kind parent val  child kind       child val

然后您需要将 adminKey 添加到您的 car.csv 文件中 - 您的导出看起来会为导出现有实体创建正确的 csv,但要导入新实体,您需要手动添加该列。

【讨论】:

  • 所以当您说“您需要将 adminKey 添加到您的 car.csv 文件中”时,您的意思是我需要将 Admin 实体的实际 Key 值从 Datastore 复制/粘贴到 CSV 中?我假设它会在导入时使用实体(管理员)并查找/使用密钥。显然这是不正确的?
  • 好吧,我基本想通了。非常感谢帮忙。我需要将“adminKey”和“carKey”的密钥放在我的 CSV 文件中。但这迫使我必须为 Car 实体提供自己的密钥。我宁愿让 Datastore 为我创建密钥。有没有办法让数据存储在批量上传时自动创建“carKey”,并将其链接到父级?
  • 如果你有一个空白,它应该生成密钥。我还没有测试过这个父子导入,但你可以尝试transform.create_deep_key(('Admin', 'adminKey'),('Car', transform.CURRENT_PROPERTY, key_is_id=True))并将carKey列留空或尝试使用transform.none_if_empty,尽管这可能已经尝试过了,请参阅this question
  • 使用key_is_id=True 无效。在“carKey”列为空的情况下更改transform.create_deep_key(('Admin', 'adminKey'),('Car', transform.CURRENT_PROPERTY, True)),我得到 Error in WorkerThread-0: invalid literal for int() with base 10: ' ' 这意味着它正在寻找“车钥匙”列。使用transform none_if_empty(transform.create_deep_key(('Admin','adminKey', True),('Car', transform.CURRENT_PROPERTY, True))) 并将“carKey”列留空,使用自动生成的 ID 导入实体,但没有父密钥!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多