1

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

是否有捷径可寻?即使用一个db.DictionaryProperty?还是我必须使用 pickle 来序列化我的字典?我的字典比较简单。它由字符串作为键组成,但它也可能包含某些键的子字典。例如:

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

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

4

3 回答 3

8

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
于 2009-12-23T16:50:42.957 回答
1

我认为你不能避免序列化你的对象。

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

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)
于 2009-12-23T16:40:19.423 回答
1

我假设当您需要能够访问字典时,它是一次性的?当它在数据存储区中时,您不必从 dict 内部获取值吗?

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

class MyModel(db.Model): #define 一些属性,包括“data”,它是一个 TextProperty,包含一个大字典 def toBasicType(self): return {'metadata': self.getMetadata(), 'data': simplejson.loads (self.data)}

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

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

于 2009-12-23T19:28:21.810 回答