我可以在 google 的 BigTable 数据存储中存储 python 字典而不显式序列化它吗?

发布于 2024-08-16 07:14:38 字数 354 浏览 6 评论 0原文

我有一个 python 字典,我想将其存储在 Google 的 BigTable 数据存储中(它是 db.Model 类中的一个属性)。

有没有简单的方法可以做到这一点?即使用db.DictionaryProperty?或者我必须使用 pickle 来序列化我的字典吗?我的字典比较简单。它由作为键的字符串组成,但它也可能包含某些键的子字典。例如:

{ 
    'myKey' : 100,
    'another' : 'aha',
    'a sub dictionary' : { 'a': 1, 'b':2 }
}

PS:如果可能的话,我想序列化为二进制,而不是文本。

I have a python dictionary that I would like to store in Google's BigTable datastore (it is an attribute in a db.Model class).

Is there an easy way to do this? i.e. using a db.DictionaryProperty? Or do I have to use pickle to serialize my dictionary? My dictionary is relatively straight forward. It consists of strings as keys, but it may also contain sub dictionaries for some keys. For example:

{ 
    'myKey' : 100,
    'another' : 'aha',
    'a sub dictionary' : { 'a': 1, 'b':2 }
}

PS: I would like to serialize as binary, not text if possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半透明的墙 2024-08-23 07:14:38

这是另一种方法

class DictProperty(db.Property):
  data_type = dict

  def get_value_for_datastore(self, model_instance):
    value = super(DictProperty, self).get_value_for_datastore(model_instance)
    return db.Blob(pickle.dumps(value))

  def make_value_from_datastore(self, value):
    if value is None:
      return dict()
    return pickle.loads(value)

  def default_value(self):
    if self.default is None:
      return dict()
    else:
      return super(DictProperty, self).default_value().copy()

  def validate(self, value):
    if not isinstance(value, dict):
      raise db.BadValueError('Property %s needs to be convertible '
                             'to a dict instance (%s) of class dict' % (self.name, value))
    return super(DictProperty, self).validate(value)

  def empty(self, value):
    return value is None

Here's another approach:

class DictProperty(db.Property):
  data_type = dict

  def get_value_for_datastore(self, model_instance):
    value = super(DictProperty, self).get_value_for_datastore(model_instance)
    return db.Blob(pickle.dumps(value))

  def make_value_from_datastore(self, value):
    if value is None:
      return dict()
    return pickle.loads(value)

  def default_value(self):
    if self.default is None:
      return dict()
    else:
      return super(DictProperty, self).default_value().copy()

  def validate(self, value):
    if not isinstance(value, dict):
      raise db.BadValueError('Property %s needs to be convertible '
                             'to a dict instance (%s) of class dict' % (self.name, value))
    return super(DictProperty, self).validate(value)

  def empty(self, value):
    return value is None
近箐 2024-08-23 07:14:38

我认为你无法避免序列化你的对象。

我将定义以下模型来存储每个键、值对:

class DictModel(db.Model):
    value = db.TextProperty()

保存到我使用的数据存储:

def set_value(key, value):
    key = DictModel(value=pickle.dumps(value), key_name=key)
    key.save()
    return key

并检索数据:

def get_value(key):
    return pickle.loads(DictModel.get_by_key_name(key).value)

I think you cannot avoid serializing your objects.

I would define the following model to store each key, value pair:

class DictModel(db.Model):
    value = db.TextProperty()

To save to the datastore I'd use:

def set_value(key, value):
    key = DictModel(value=pickle.dumps(value), key_name=key)
    key.save()
    return key

And to retrieve data:

def get_value(key):
    return pickle.loads(DictModel.get_by_key_name(key).value)
岁月静好 2024-08-23 07:14:38

我认为当你需要能够访问字典时,它是一次性的吗?当字典位于数据存储中时,您不必从字典内部获取值吗?

如果是这样,您将必须序列化,但不必使用 pickle;我们使用 simplejson 代替。然后检索是重写 toBasicType() 的简单问题,有点像这样:

class MyModel(db.Model):
#定义一些属性,包括“data”,它是一个包含大字典的 TextProperty
def toBasicType(self):
返回 {'元数据': self.getMetadata(),
'data': simplejson.loads(self.data)}

创建涉及调用 MyModel(...,simplejson.dumps(data),...)。

如果您已经在进行酸洗,这可能是您最好的选择,但 simplejson 对我们来说工作得很好。

I assume that when you need to be able to reach the dict, it's all-at-once? You don't have to get values from inside the dict while it's in the datastore?

If so, you'll have to serialize, but don't have to use pickle; we use simplejson instead. Then retrieving is a simple matter of overriding toBasicType(), sort of like this:

class MyModel(db.Model):
#define some properties, including "data" which is a TextProperty containing a biggish dict
def toBasicType(self):
return {'metadata': self.getMetadata(),
'data': simplejson.loads(self.data)}

Creation involves calling MyModel(...,simplejson.dumps(data),...).

If you're already pickling, that may be your best bet, but simplejson's working pretty well for us.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文