Проблема с загрузчиком Google App Engine при использовании автоматически созданной конфигурации yaml и объектов с числовым идентификатором
Мое приложение использует 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, содержимое сущностей которых выделено в одну строку.
РЕДАКТИРОВАТЬ
Я попытался сделать то, что предложил @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 ответа
У вас есть export_transform 'key_id_or_name_as_string', но у вас нет соответствующего преобразования import. Попробуй это:
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" - это имя типа, указанного в файле конфигурации.
Это прекрасно работает для меня:
import_transform: transform.none_if_empty(long)