2010-06-27 10 views
5

La mia applicazione utilizza Django non-rel. Non ho accesso al modello.Problema con il programma di caricamento di massa di Google App Engine quando si utilizza la configurazione con generatore automatico yaml e le entità con ID numerico

Ho il mio file bulkloader.yaml generato automaticamente da appcfg.py create_bulkloader_config.

Il problema è l'ID numerico delle entità che vengono importate come nomi di chiavi stringa. Quindi, se esporto l'entità con ID int, ad esempio "62", viene importato come entità con il nome della chiave stringa "61" che rovina Django.

Revelant bulkloader.yaml Frammento:

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

sto cercando di configurazione di upload od il download dei dati/utilizzando bulkloader, e voglio avere i dati come facile da capire il formato (come .csv) - - Quindi usare bulkloader.py --dump (...) non è un'opzione praticabile dato che mi dà file sqlite3 con contenuti di entità decapitati come una singola riga.

EDIT

Ho provato a fare quello che @ Nick ha suggerito ed ho ottenuto un'eccezione:

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

Questo significa che devo attenersi a bulkloader.py (che utilizza tale formato SQLite werid) o Ho fatto qualcosa? ;)

intestazione di Transformer:

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

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

risposta

6

hai l'export_transform 'key_id_or_name_as_string', ma non si dispone di un corrispondente di importazione trasformare. Prova questo:

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) 

Dove "Tipo" è il nome del tipo identificato nel file di configurazione.

+0

Grazie per la risposta. Il mio problema è con la chiave primaria, è solo il nome della funzione 'create_foreign_key' fuorviante? –

+0

Il nome è fuorviante - probabilmente dovrebbe essere semplicemente 'create_key'. –

+0

OK :) Ci proverò APPENA POSSIBILE! –

2

Questo funziona bene per me:

import_transform: transform.none_if_empty(long)