0

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

4

1 回答 1

2

刚看到你的帖子。我可以在我的 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
于 2011-07-17T12:52:02.763 回答