代码之家  ›  专栏  ›  技术社区  ›  jb.

Google App Engine bulkloader issue when using yaml autogenerated configuration and entities with numeric ID

  •  5
  • jb.  · 技术社区  · 14 年前

    我的应用程序使用 Django non-rel . 我没有进入模型的机会。

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

    问题是,实体的数字标识正作为字符串键名导入。因此,如果我导出int id为的实体,例如, “62” 它以字符串关键字的名称导入实体。 “61” 这把Django搞糟了。

    启示录:

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

    我正在尝试使用Bulkloader设置下载/上传OD数据,我想让数据具有易于理解的格式(如.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 回复  |  直到 8 年前
        1
  •  6
  •   Nick Johnson    14 年前

    您已经将导出转换“key-id-u”或“name-u”作为“字符串”,但没有相应的导入转换。试试这个:

    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)
    

    “类型”是配置文件中标识的类型的名称。

        2
  •  2
  •   Kurt Huwig    13 年前

    这对我来说很好:

    import_transform: transform.none_if_empty(long)