在Google App Engine中,如何配置bulkloader.yaml来处理模型上的可选外键?

时间:2012-01-23 09:07:07

标签: python google-app-engine foreign-keys bulkloader

我在App Engine中有一个模型,我以CSV格式导出,然后使用appcfg.py和bulkloader.yaml导入到我的本地开发环境。

我可以导入和导出大多数模型,但是我遇到的问题是具有外键的模型并不总是存在。我可以使用下面的lambda导入始终将外键导入为None,或者在我的csv文件中的每一行都有外键时使用create_foreign_key()转换来导入外键。

如何配置bulkloader.py以在外键存在时导入外键并在外键不存在时将其忽略?

- kind: MyModel
  connector: csv
  connector_options:
  property_map:
    - property: myOtherModel
      external_name: myOtherModel
      import_transform: "lambda x: x is None and None or None"
      #import_transform: transform.create_foreign_key('MyOtherModel', key_is_id=True)
      export_transform: transform.key_id_or_name_as_string

只是取消注释第二个import_transform代替lambda变换将产生此错误。

File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/bulkload/transform.py", line 127, in generate_foreign_key_lambda
    value = int(value)
ValueError: invalid literal for int() with base 10: ''

运行appcfg.py时会发生此错误。所有其他没有外键或外键始终存在的导入都正常工作。

appcfg.py upload_data --config_file=bulkloader.yaml --num_threads=1 --batch_size=50 --url=http://localhost:8080/remote_api --email=Chris --passin --kind=MyModel --filename=MyModel.csv

csv文件中的myOtherModel列有时包含MyOtherModel.key().id(),有时不包含myOtherModel 1234 4567 2345 5678

例如

{{1}}

2 个答案:

答案 0 :(得分:2)

foreign key值不存在时,reference property取值None并且代码为此默认behivour:

import_transform: transform.create_foreign_key('MyOtherModel')

在错误消息中:value does not exist显示您使用的内容 'othercolumn','','anohtercolumn'代替'othercolumn',,'anohtercolumn'

因此,如果来源''即可处理此问题:

来自此链接:http://eikke.com/python-ifelse-in-lambda/ 正如Thomas Thurman评论的那样,lambda表达式应该如下:

import-transform: "lambda x: [x, None][x=='']"

我希望它适合你

答案 1 :(得分:0)

解决这个问题的一种方法是:

  1. 导入所有没有密钥的实体,其中bulkloader.yaml没有为模型指定的密钥属性导入转换。

  2. 导出所有实体。

  3. 导入实体。 (所有这些都将具有关键值)

  4. 稍微好一点:

    1. 使用带有键属性导入转换的bulkloader.yaml导入所有具有键的实体。

    2. 使用不带密钥属性导入转换的bulkloader.yaml导入所有没有密钥的实体。

    3. 这有点麻烦。我希望有一种方法可以让实体在导入时自动分配一个键值。