我在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}}
答案 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)
解决这个问题的一种方法是:
导入所有没有密钥的实体,其中bulkloader.yaml没有为模型指定的密钥属性导入转换。
导出所有实体。
导入实体。 (所有这些都将具有关键值)
稍微好一点:
使用带有键属性导入转换的bulkloader.yaml导入所有具有键的实体。
使用不带密钥属性导入转换的bulkloader.yaml导入所有没有密钥的实体。
这有点麻烦。我希望有一种方法可以让实体在导入时自动分配一个键值。