3

我正在使用批量加载程序将数据上传到我的 App Engine 数据存储中。

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

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

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

near_countries = ndb.JsonProperty()

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

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

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

4

2 回答 2

3

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

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

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

所以我将我的列表或字典转换为字符串 JSON 字符串表示形式,然后将其转换为 blob,以便批量加载程序可以存储它:

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

同样的推理修复了保存为字符串的 TextProperty(在我上面的评论中提到)。您需要db.Text用作转换功能:

import_transform: db.Text

为了保存repeated=TrueTextProperty,我实际上还必须将其转换为 blob:

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

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

于 2013-03-01T14:27:11.240 回答
1

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

于 2013-03-01T01:31:56.603 回答