2010-06-27 6 views
5

Meine Anwendung verwendet Django non-rel. Ich habe keinen Zugriff auf das Modell.Problem mit dem Google App Engine-Massenlader bei der Verwendung der von yaml automatisch generierten Konfiguration und Entitäten mit der numerischen ID

Ich habe meine bulkloader.yaml Datei automatisch generiert von appcfg.py create_bulkloader_config.

Problem ist Entities numerische IDs werden als String-Schlüsselnamen importiert. Wenn ich also eine Entity mit einer int ID von beispielsweise '62' exportiere, wird sie als Entität mit dem String-Schlüsselnamen '61' importiert, der Django verschraubt.

Revelant bulkloader.yaml Fragment:

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

Ich Setup Download/Upload od Daten versuchen bulkloader verwenden, und ich möchte Daten so einfach haben, Format zu verstehen (wie .csv) - - so bulkloader.py --dump (...) zu verwenden ist keine praktikable Option, da es mir sqlite3-Dateien gibt, die den Inhalt von Entitäten als einzelne Zeile gebeizt haben.

EDIT

Ich habe versucht zu tun, was @ Nick vorgeschlagen und ich bekam eine Ausnahme:

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

Dies bedeutet, dass ich (das verwendet diese werid SQLite-Format) bulkloader.py zu haften haben oder Ich habe etwas durcheinandergebracht? ;)

Kopf von Transformator:

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

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

Antwort

6

Sie die export_transform haben 'key_id_or_name_as_string', aber Sie haben keinen entsprechenden Import verwandeln. Versuchen Sie folgendes:

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) 

Wo 'Kind' ist der Name der Art in der Konfigurationsdatei identifiziert.

+0

Danke für Antwort. Mein Problem ist mit Primärschlüssel, ist nur der Name der Funktion 'create_foreign_key' irreführend? –

+0

Der Name ist irreführend - er sollte wahrscheinlich einfach 'create_key' sein. –

+0

OK :) Ich werde das so schnell wie möglich versuchen! –

2

Dies funktioniert gut für mich:

import_transform: transform.none_if_empty(long) 
Verwandte Themen