2010-06-27 17 views
5

Mi aplicación usa Django non-rel. No tengo acceso al modelo.Problema del cargador masivo de Google App Engine al usar la configuración autogenerada yam y entidades con ID numérico

Tengo mi archivo bulkloader.yaml autogenerado por appcfg.py create_bulkloader_config.

El problema es que las entidades ID numéricas se importan como nombres de clave de cadena. Por lo tanto, si exporto una entidad con ID int de, por ejemplo, '62', se importa como entidad con el nombre de clave de cadena '61' que daña Django.

Revelant Fragmento bulkloader.yaml:

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

estoy tratando de datos od de carga descarga de instalación/uso bulkloader, y yo quiero tener datos mientras que el formato fácil de entender (como CSV) - - Así que usar bulkloader.py --dump (...) no es una opción viable ya que me da archivos sqlite3 que tienen contenido de entidades en escabeche como una sola fila.

EDITAR

He intentado hacer lo que sugirió @ Nick y yo tiene una excepción:

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

¿Quiere decir esto que tengo que se adhieren a bulkloader.py (que utiliza ese formato SQLite werid) o ¿Metí la pata algo? ;)

cabecera del transformador:

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

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

Respuesta

6

que tenga el export_transform 'key_id_or_name_as_string', pero que no tienen una importación correspondiente transformar. Prueba esto:

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) 

Donde 'clase' es el nombre de la clase identificada en el archivo de configuración.

+0

Gracias por la respuesta. Mi problema es con la clave principal, ¿es el nombre de la función 'create_foreign_key' engañoso? –

+0

El nombre es engañoso: probablemente debería ser simplemente 'create_key'. –

+0

OK :) ¡Lo intentaré lo antes posible! –

2

Esto funciona muy bien para mí:

import_transform: transform.none_if_empty(long)