【问题标题】:Appengine Bulkloader with django-nonrelAppengine Bulkloader 与 django-nonrel
【发布时间】:2011-05-27 08:42:21
【问题描述】:

我想按照http://thomas.broxrost.com/category/google-app-engine/http://blog.suinova.com/2009/03/tutorial-on-bulkloading-data-onto-app.html 中的建议将appengine bulkloader 与我的django-nonrel 项目一起使用。 但它给出错误:没有名为 google.appengine.ext.webapp 的模块。我认为这是因为 Django-nonrel,我无法访问 google webapp。如果我错了,请纠正我。此外,似乎我的模型字段也与谷歌批量加载器所支持的不同。 如果有人知道其他选择,请告诉我。欢迎任何在线文档或指针:-)

【问题讨论】:

    标签: python google-app-engine django-nonrel


    【解决方案1】:

    刚看到你的帖子。我可以在我的 django-nonrel 项目中使用 appengine bulkloader。

    有几点需要注意:

    • 在我需要批量加载的模型上,我通过在要用作主键的字段中放置“primary_key=True”来手动设置主键。这使得 Django 使用您的主键字段的 key_name 创建模型,并且您可以确定您创建的模型将具有已知的主键。 (而不是让自动 pk 字段控制,然后 pk 是 appengine 的随机 id 字段)

    • 在您的 bulkloader.yaml 文件中,使用“field_id”引用您的外键属性字段。 django 构建 db 模式的方式是外键字段实际上是存储有 '_id' 的。不要尝试使用 import_transform 和 export_transform 将您的字段变成 appengine 的“关键”字段...

    这是我目前工作的一个例子。

    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)
    

    我对该字段的 bulkloader.yaml 声明如下所示:

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

    然后,您的 csv 文件只需要包含您在“external_name”声明中引用它们的字段标题,以及要批量加载的相应数据!

    您可以通过在本地运行服务器运行时运行类似于以下内容来确保它在本地环境中运行:

    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
    

    【讨论】:

    • 好吧 Aaron..谢谢您的回答..我等了很久 :-) 会尝试并尽快更新您。
    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2011-10-31
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多