2

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

我可以导入和导出大多数模型,但是我遇到了具有并不总是存在的外键的模型的问题。当我的 csv 文件中的每一行都有外键时,我可以使用下面的 lambda 导入始终将外键导入None或使用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

myOtherModelcsv 文件中的列有时包含MyOtherModel.key().id(),有时不包含。

例如。

myOtherModel
1234
4567

2345

5678
4

2 回答 2

2

foreign key值不存在时的默认行为,reference property采用 value:None和代码:

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=='']"

我希望这个对你有用

于 2012-01-23T09:14:11.933 回答
0

处理此问题的一种方法是:

  1. 使用没有为模型指定的键属性导入转换的 bulkloader.yaml 导入所有没有键的实体。

  2. 导出所有实体。

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

一个稍微好一点的变化:

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

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

这有点麻烦。我想要一种方法让实体缺少键值,在导入时自动分配一个键值。

于 2013-06-17T00:48:10.723 回答