Python 在Google App Engine中,如何配置bulkloader.yaml来处理模型上的可选外键?
我有一个应用程序引擎中的模型,我以CSV格式导出,然后使用appcfg.py和bulkloader.yaml导入到我的本地开发环境中 我可以导入和导出大多数模型,但对于外键不总是存在的模型,我遇到了一些问题。我可以使用下面的lambda导入始终将外键作为Python 在Google App Engine中,如何配置bulkloader.yaml来处理模型上的可选外键?,python,google-app-engine,foreign-keys,bulkloader,Python,Google App Engine,Foreign Keys,Bulkloader,我有一个应用程序引擎中的模型,我以CSV格式导出,然后使用appcfg.py和bulkloader.yaml导入到我的本地开发环境中 我可以导入和导出大多数模型,但对于外键不总是存在的模型,我遇到了一些问题。我可以使用下面的lambda导入始终将外键作为None导入,或者在我的csv文件中的每一行都有外键时,使用create\u foreign\u key()转换导入外键 如何配置bulkloader.py在外键存在时导入外键,在外键不存在时忽略外键 - kind: MyModel conn
None
导入,或者在我的csv文件中的每一行都有外键时,使用create\u foreign\u 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\u变换
而不是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()
,有时不包含
例如
默认情况下,
外键
值不存在时,引用属性
取值:无
,此代码:
import_transform: transform.create_foreign_key('MyOtherModel')
如错误消息中所示:值不存在
显示您使用
'othercolumn'、''、'anohtercolumn'
而不是'othercolumn'、'anohtercolumn'
因此,如果源“”要处理此问题:
通过此链接:
正如Thomas Thurman所评论的,lambda表达式应该如下所示:
import-transform: "lambda x: [x, None][x=='']"
我希望它对您有用处理此问题的一种方法是:
这有点麻烦。我想找到一种方法,在导入时自动为缺少键值的实体分配键值。否。这就是问题所在。使用transform.create\u foreign\u key()行将导致我刚才添加的错误。它们匹配。如果我在MyModel的CSV文件中为每个MyThermodel外键属性的列中添加一个id,那么一切都会正常工作。似乎我没有得到默认的无选项。好的。谢谢你的努力。你能帮我正确地写这行吗?lambda x:int(x)>0和x或“创建外键”问题似乎是由于某种原因,bulkloader进程试图将空白“”解析为int。这就是为什么我尝试只执行lambda表达式,以便捕获不存在的外键并防止错误。感谢您指出其他StackOverflow问题。我已经看过了,但都没有涉及归还钥匙。当列中存在数字时,我需要能够返回create_foreign_key(),但找不到语法。
import-transform: "lambda x: [x, None][x=='']"