Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 使用bulkloader将dict导入App Engine ndb.JsonProperty_Google App Engine_App Engine Ndb_Bulkloader - Fatal编程技术网

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

Google app engine 使用bulkloader将dict导入App Engine ndb.JsonProperty,google-app-engine,app-engine-ndb,bulkloader,Google App Engine,App Engine Ndb,Bulkloader,我正在使用bulkloader将数据上传到我的应用程序引擎数据存储中 我似乎无法将字典存储到JsonProperty中,并且出现以下错误: BadValueError:附近国家/地区的属性类型不受支持: 我的模型将此属性定义为JsonProperty: 邻近国家=ndb.JsonProperty() 我找到的唯一解决方法似乎是存储我的值的json.dumps(),但我想这基本上是存储字典的字符串表示,而不是字典本身 我对JsonProperty的理解是,它以python对象作为值,我不应该为nd

我正在使用bulkloader将数据上传到我的应用程序引擎数据存储中

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

BadValueError:附近国家/地区的属性类型不受支持:

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

邻近国家=ndb.JsonProperty()

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

我对JsonProperty的理解是,它以python对象作为值,我不应该为ndb将处理的JSON序列化而烦恼。我说得对吗

值是可使用Python的json模块序列化的Python对象(例如列表、dict或字符串);数据存储将JSON序列化存储为blob


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

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

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

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

导入_转换:“lambda x:transform.blobproperty_来自_base64(base64.b64encode)(字节(json.dumps(x.strip(',')).split(',')))”

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

导入转换:db.Text

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

导入_转换:“lambda x:transform.blobproperty_来自_base64(base64.b64encode)(字节(json.dumps(x.strip(',')).split(',')))”


(在上面的示例中,我实际上将一个由coma分隔的字符串转换成一个文本对象列表,存储在
TextProperty(repeated=True)

谢谢。问题是当我调用json.dumps()时我自己,字符串被存储在数据存储中,而不是blob。我可以在管理控制台中看到存储的值,尽管该属性被定义为JsonProperty,这将导致存储二进制。当稍后加载该属性时,它抱怨它不是JSON对象。我实际上认为它可能与bulkloa相关der验证。任何人都知道在哪里可以找到它,我将尝试查看是否可以丢失它,以确保我的属性在JsonProperty中被接受。我找到的唯一其他解决方法是首先通过bulkloader将字符串导入TextProperty,然后运行一个脚本,该脚本将从字符串创建备份并将其存储到JsonProperty中。而不是o不过,这是最好的。bulkloader的某些验证肯定存在问题。我还收到以下错误:属性XXXX太长。最大长度为500。对于声明为TextProperty的属性XXXX(默认情况下未编制索引,此处不应应用500最大长度)我在这里找到了关于TextProperty的最后一条评论的答案:在使用bulkloader导入时,基本上需要使用db.Text来转换字符串,以确保它保存为TextProperty