Проблема с загрузчиком Google App Engine при использовании автоматически созданной конфигурации yaml и объектов с числовым идентификатором - PullRequest
5 голосов
/ 28 июня 2010

Мое приложение использует Django non-rel .У меня нет доступа к модели.

Мой bulkloader.yaml файл автоматически сгенерирован appcfg.py create_bulkloader_config.

Проблема в том, что числовые идентификаторы сущностей импортируются как имена строковых ключей.Так что, если я экспортирую сущность с int ID, например, '62' , он будет импортирован как сущность с именем строкового ключа '61' , что испортит Django.

Revelant bulkloader.yaml Фрагмент:

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

Я пытаюсь настроить загрузку / выгрузку данных od с помощью массового загрузчика, и я хочу, чтобы данные были в простом для понимания формате (как .csv) --- поэтому использование bulkloader.py --dump (...) не является жизнеспособным вариантом, поскольку дает мне файлы sqlite3, содержимое сущностей которых выделено в одну строку.

EDIT

Я попытался сделать то, что предложил @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) 

Весь стек:

      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 ]

6 голосов
/ 28 июня 2010

У вас есть 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' - это имя вида, указанного в файле конфигурации.

2 голосов
/ 04 апреля 2011

Это прекрасно работает для меня:

import_transform: transform.none_if_empty(long)
...