2010-06-27 20 views
5

Mon application utilise Django non-rel. Je n'ai pas accès au modèle. J'ai mon fichier généré automatiquement par appcfg.py create_bulkloader_config.Problème lié au bulkloader Google App Engine lors de l'utilisation de la configuration autogénérée yaml et des entités avec un ID numérique

Problème: les entités numériques sont importées en tant que noms de clé de chaîne. Donc, si j'exporte l'entité avec l'ID int, par exemple, '62', il est importé en tant qu'entité avec le nom de clé de chaîne '61' qui vrille Django.

Revelant bulkloader.yaml Fragment:

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

Je suis en train de configurer le téléchargement/téléversement des données à l'aide bulkloader od, et je veux avoir des données aussi facile de comprendre le format (comme .csv) - - donc l'utilisation de bulkloader.py --dump (...) n'est pas une option viable car elle me donne des fichiers sqlite3 dont le contenu des entités est décapé en une seule ligne.

EDIT

J'ai essayé de faire ce que je suggère @ Nick a obtenu une exception:

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

Est-ce que cela signifie que je dois en tenir à bulkloader.py (qui utilise ce format werid sqlite) ou J'ai foiré quelque chose? ;)

tête de transformateur:

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

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

Répondre

6

Vous avez le export_transform 'key_id_or_name_as_string', mais vous ne disposez pas d'une importation correspondante transformer. Essayez ceci:

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) 

Où 'Kind' est le nom du type identifié dans le fichier de configuration.

+0

Merci pour la réponse. Mon problème est avec la clé primaire, est juste le nom de la fonction 'create_foreign_key' trompeur? –

+0

Le nom est trompeur - il devrait probablement être simplement 'create_key'. –

+0

OK :) Je vais essayer le plus vite possible! –

2

Cela fonctionne bien pour moi:

import_transform: transform.none_if_empty(long)