使用yaml自动生成配置和具有数字ID的实体时出现Google App Engine批量加载程序问题

时间:2010-06-27 23:26:00

标签: python django google-app-engine django-nonrel bulkloader

我的应用使用Django non-rel。我无法访问模型。

我的bulkloader.yaml文件由appcfg.py create_bulkloader_config自动生成。

问题是实体数字ID正在作为字符串键名导入。因此,如果我导出具有int ID的实体,例如 '62',它将作为实体导入,其字符串键名为 '61',这会搞砸Django。< / p>

Revelant bulkloader.yaml Fragment:

 property_map:
  - property: __key__
    external_name: key
    export_transform: transform.key_id_or_name_as_string

我正在尝试使用bulkloader设置下载/上传数据,我希望数据具有易于理解的格式(如.csv)---所以使用bulkloader.py --dump (...)不是一个可行的选择,因为它给我sqlite3文件,其中实体内容被腌制为一行。

修改

我尝试过做@Nick建议的事情,我得到了一个例外:

 ErrorOnTransform: Numeric keys are not supported on input at this time.

这是否意味着我必须坚持使用bulkloader.py(使用那种werid sqlite格式)或者我搞砸了什么? ;)

变形金刚的标题:

- kind: auth_user
    connector: csv
    connector_options:
      encoding: utf-8
      skip_import_header_row: True
      print_export_header_row: True

    property_map:
      - property: __key__
        external_name: key
        export_transform: transform.key_id_or_name_as_string
        import_transform: transform.create_foreign_key('auth_user', key_is_id=True) 

整个Stacktrace:

      Traceback (most recent call last):
      File "/opt/google/appengine/google/appengine/tools/adaptive_thread_pool.py", line 150, in WorkOnItems
        status, instruction = item.PerformWork(self.__thread_pool)
      File "/opt/google/appengine/google/appengine/tools/bulkloader.py", line 693, in PerformWork
        transfer_time = self._TransferItem(thread_pool)
      File "/opt/google/appengine/google/appengine/tools/bulkloader.py", line 848, in _TransferItem
        self.content = self.request_manager.EncodeContent(self.rows)
      File "/opt/google/appengine/google/appengine/tools/bulkloader.py", line 1269, in EncodeContent
        entity = loader.create_entity(values, key_name=key, parent=parent)
      File "/opt/google/appengine/google/appengine/ext/bulkload/bulkloader_config.py", line 385, in create_entity
        return self.dict_to_entity(input_dict, self.bulkload_state)
      File "/opt/google/appengine/google/appengine/ext/bulkload/bulkloader_config.py", line 131, in dict_to_entity
        instance = self.__create_instance(input_dict, bulkload_state_copy)
      File "/opt/google/appengine/google/appengine/ext/bulkload/bulkloader_config.py", line 209, in __create_instance
        'Numeric keys are not supported on input at this time.')

2 个答案:

答案 0 :(得分:6)

您已获得export_transform'key_id_or_name_as_string',但您没有相应的导入转换。试试这个:

property_map:
 - property: __key__
   external_name: key
   export_transform: transform.key_id_or_name_as_string
   import_transform: transform.create_foreign_key('Kind', key_is_id=True)

其中'Kind'是配置文件中标识的类型的名称。

答案 1 :(得分:2)

这对我来说很好用:

import_transform: transform.none_if_empty(long)