2011-05-27 3 views
0

Je veux utiliser le chargeur de masse appengine avec mon projet django-nonrel comme suggéré dans http://thomas.broxrost.com/category/google-app-engine/ et dans http://blog.suinova.com/2009/03/tutorial-on-bulkloading-data-onto-app.html. Mais il donne une erreur: Aucun module nommé google.appengine.ext.webapp. Je pense que c'est à cause de Django-nonrel, je ne suis pas en mesure d'accéder à google webapp.Corriger moi si je me trompe. En outre, il semble que mes champs de modèle sont aussi différents que supposés par google bulkloader. Faites-moi savoir si quelqu'un connaît une autre solution. Tous les documents en ligne ou des pointeurs sont les bienvenus :-)Appengine Bulkloader avec django-nonrel

Répondre

2

juste vu votre poste. Je suis capable d'utiliser le bulkloader appengine très bien avec mon projet django-nonrel.

Il y a deux choses à noter:

  • Sur les modèles je besoin chargés en bloc, j'ai les clés primaires définies manuellement en plaçant « primary_key = True » dans le domaine que je veux utiliser comme primaire clé. Cela permet à Django de créer le modèle avec un nom-clé de votre champ de clé primaire et vous pouvez être sûr que les modèles que vous créez auront des clés primaires connues. (au lieu de laisser les champs auto pk prendre le contrôle, puis le champ pk est le champ id aléatoire d'appengine)

  • Dans votre fichier bulkloader.yaml, référencez vos champs de propriété de clé étrangère avec 'field_id'. La façon dont django construit le schéma db est que les champs clés étrangers sont stockés avec le '_id' collé. Ne pas essayer d'utiliser le import_transform et export_transform pour transformer votre champ en un AppEngine champ « clé » ...

Voici un exemple de ce que je travaille actuellement que.

class Team(models.Model): 
    appengine_key = models.CharField(max_length=100, primary_key=True) 
    abbr = models.CharField(max_length=3) 
    name = models.CharField(max_length=10) 
    division = models.ForeignKey(Division, related_name="teams") 
    is_active = models.BooleanField(default=True) 
    created_time = models.DateTimeField(auto_now_add=True) 
    updated_time = models.DateTimeField(auto_now=True) 

Ma déclaration bulkloader.yaml pour ce champ ressemble à ceci:

python_preamble: 
- import: google.appengine.ext.bulkload.transform 
- import: google.appengine.ext.db 
- import: re 
- import: base64 
- import: datetime 

transformers: 
- kind: app_team 
    connector: csv 
    connector_options: 
    encoding: utf-8 
    columns: from_header 

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

    - property: abbr 
     external_name: abbr 

    - property: name 
     external_name: name 

    - property: division_id 
     external_name: division 

    - property: is_active 
     external_name: is_active 
     import_transform: transform.none_if_empty(bool) 

    - property: created_time 
     external_name: created_time 
     import_transform: transform.import_date_time('%m/%d/%Y %H:%M:%S') 
     export_transform: transform.export_date_time('%m/%d/%Y %H:%M:%S') 

    - property: updated_time 
     external_name: updated_time 
     import_transform: transform.import_date_time('%m/%d/%Y %H:%M:%S') 
     export_transform: transform.export_date_time('%m/%d/%Y %H:%M:%S') 

Ensuite, votre fichier csv juste besoin d'avoir les en-têtes de champ que vous les mentionnés dans la déclaration « external_name », et les données correspondantes à charger en masse!

Vous pouvez vous assurer qu'il fonctionne sur votre environnement local en exécutant quelque chose de similaire à ce qui suit pendant que votre runserver locale est en cours d'exécution:

python2.5 /usr/local/bin/appcfg upload_data --config_file=app/bulkloader.yaml --filename=app/fixtures/teams.csv --kind=app_team --url=http://localhost:8080/_ah/remote_api app 
+0

Eh bien Aaron..Thanks pour vos answer..its un peu de temps I attendu cela :-) va l'essayer et vous mettre à jour bientôt. – SRC

Questions connexes