与django-nonrel的Appengine Bulkloader

时间:2011-05-27 08:42:21

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

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

1 个答案:

答案 0 :(得分:2)

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

有几点需要注意:

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

  • 在bulkloader.yaml文件中
  • ,使用'field_id'引用您的外键属性字段。 django构造数据库模式的方式是外键字段实际存储时加上'_id'。不要尝试使用import_transform和export_transform将您的字段转换为appengine“key”字段...

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

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'声明中引用它们的字段标题,以及要批量加载的相应数据!

您可以通过在本地runserver运行时运行类似以下的内容来确保它适用于您的本地环境:

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