我可以不显式地将python字典存储在google的BigTable数据存储中吗?

2024-09-25 00:36:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有没有一个简单的方法可以做到这一点?i、 e.使用db.DictionaryProperty?还是必须使用pickle来序列化我的字典?我的字典比较直截了当。它由字符串作为键组成,但也可能包含某些键的子字典。例如:

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

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


Tags: 数据方法字符串dbmodel字典属性序列化
3条回答

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

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

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

要保存到数据存储,我将使用:

^{pr2}$

以及检索数据:

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

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

我想,当你需要接触到口述的时候,它是一次完成的?当dict在数据存储中时,您不必从dict内部获取值?在

如果是这样,则必须序列化,但不必使用pickle;而是使用simplejson。那么,检索是一个简单的重写toBasicType()的问题,类似于:

MyModel类(数据库模型): #定义一些属性,包括“data”,它是一个包含较大dict的TextProperty 定义烟草类型(自身): 返回{'metadata':self.getMetadata(), “数据”:simplejson.loads(自我数据)}在

创建包括调用MyModel(。。。,simplejson.dumps公司(数据),…)。在

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

相关问题 更多 >