python - 使用 yaml 自动生成的配置和具有数字 ID 的实体时,Google App Engine bulkloader 问题

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

我的应用程序使用 Django non-rel .我无权访问模型。

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

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

相关的 bulkloader.yaml 片段:

 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(使用那种奇怪的 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) 

整个堆栈跟踪:

      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.')

最佳答案

你有 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)

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

关于python - 使用 yaml 自动生成的配置和具有数字 ID 的实体时,Google App Engine bulkloader 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3129286/

相关文章:

python - VirtualEnv 真的适用于 Python 吗?

python - 为什么 sys.argv[] 中有一个空格?

Apache 和 mod_wsgi 中的 Django 自定义错误处理程序

java - JSON 解析没有值(value)

Google Datastore 中使用游标的多线程

python - 如何在 python 中使用列表理解?

python - 我怎样才能得到像 "1.number=85 2.number=97"这样的输出

django - 如何将模型管理员添加到 Django 管理员中的另一个应用程序部分?

python - 如何将 optgroups 添加到 django ModelMultipleChoiceField?

PHP GAE 无法在本地运行 SDK