使用bulkloader将dict导入App Engine ndb.JsonProperty

时间:2013-03-01 01:13:53

标签: google-app-engine app-engine-ndb bulkloader

我正在使用bulkloader将数据上传到我的App Engine数据存储中。

我似乎无法将字典存储到JsonProperty中,并且收到以下错误:

  

BadValueError:属性nearby_countries的不支持类型:< type'dict'>

我的模型将此属性定义为JsonProperty:

  

nearby_countries = ndb.JsonProperty()

我找到的唯一解决方法似乎是存储了我的值的json.dumps(),但我想这基本上存储了字典的字符串表示而不是字典本身。

我对JsonProperty的理解是它需要一个python对象作为值,我不应该为ndb将要处理的JSON序列化烦恼。我是对的吗?

  

Value是一个Python对象(例如列表或字典或字符串),可以使用Python的json模块进行序列化;数据存储区将JSON序列化存储为blob。

2 个答案:

答案 0 :(得分:3)

经过大量尝试&错误以及谷歌搜索类似的帖子,我设法找到以下帖子,它引导我下面的解决方案:

http://blog.thekensta.com/2012/06/google-app-engine-bulk-loader-and-ndb.html

简而言之,JsonProperties存储为blob,我们需要传递bulkloader正确的transform方法,以便从json字符串生成blob。我们可以使用transform.blobproperty_from_base64(来自google.appengine.ext.bulkload.transform模块)

所以我将我的列表或字典转换为字符串JSON字符串表示,然后转换为blob,以便bulkloader可以存储它:

  

import_transform:“lambda x:transform.blobproperty_from_base64(base64.b64encode(bytes(json.dumps(x.strip(',')。split(',')))))”

同样的推理修复了TextProperty保存为Strings(在我上面的评论中提到)。您需要使用db.Text作为转换函数:

  

import_transform:db.Text

为了保存repeated=True TextProperty,我实际上也必须将它转换为blob:

  

import_transform:“lambda x:transform.blobproperty_from_base64(base64.b64encode(bytes(json.dumps(x.strip(',')。split(',')))))”

(在上面的示例中,我实际上将一个逗号分隔的字符串转换为要存储在TextProperty(repeated=True)

中的Text对象列表

答案 1 :(得分:1)

一般来说,你对JsonProperty是正确的。但是,批量装载机是特殊的。老实说,我不太了解它是如何工作的,但在这种情况下,如果你需要自己调用json.dumps(),我不会感到惊讶。