PYTHON - 数据存储区

时间:2017-11-27 09:18:00

标签: python google-app-engine google-cloud-datastore app-engine-ndb

根据字段类型TextProperty的云数据存储文档,不应该对大小有任何限制,但在我的情况下,它给出了以下错误,字符串大小等于

  

属性“{my_field_name}”的值超过1048487字节

以下是我的实体类

class History(ndb.Model):
    user_mail = ndb.StringProperty()
    json_string = ndb.TextProperty(indexed=False)
    updated_date = ndb.DateTimeProperty()

这是我试图存储实体的功能

def store_user_mail(user_email, json_object):

    # string size for which this is creating problem is around 1.56Mb
    print(sys.getsizeof(json.dumps(json_object)))

    user_mail_obj = History()
    user_mail_obj.user_mail = user_email
    user_mail_obj.json_string = json.dumps(json_object)
    user_mail_obj.updated_date = datetime.datetime.utcnow()

    user_mail_obj.put()

此外,我在存储之前尝试过压缩json字符串,但这会给我们带来问题,因为我们希望将其存储为text属性而不是二进制数据。

同样重要的是,我的json_string字段为 TextProperty 类型,无论字符串大小如何,都应该存储它而不会出现任何问题。已经花了很多时间搞清楚解决方案。我在这里做错了什么,或者是 NDB 数据存储区的错误,如果是这样的话,什么是一个好的解决方案?

1 个答案:

答案 0 :(得分:1)

实体的大小限制为1MB。如果您要在实体/属性中存储的内容可能大于那个,那么您需要使用CloudStorage。我建议将该文本存储为云存储中的文件,并在对象的属性中保留链接。它可能看起来像这样:

class History(ndb.Model):
    user_mail = ndb.StringProperty()
    url = ndb.StringProperty() #https://storage.googleapis.com/{app_id}/{file_name}
    updated_date = ndb.DateTimeProperty()

然后,当您需要该文本时,您只需阅读该网址中存储的文件。